import pytest from django.core import mail from pytest_django.asserts import assertContains, assertNotContains from users.models import Invite, User @pytest.mark.django_db def test_signup_disabled(client, config_system): """ Tests that disabling signup takes effect """ # Signup disabled and no signup text config_system.signup_allowed = False response = client.get("/auth/signup/") assertContains(response, "Not accepting new users at this time", status_code=200) assertNotContains(response, "") # Signup disabled with signup text configured config_system.signup_text = "Go away!!!!!!" response = client.get("/auth/signup/") assertContains(response, "Go away!!!!!!", status_code=200) # Ensure direct POST doesn't side step guard response = client.post( "/auth/signup/", data={"email": "test_signup_disabled@example.org"} ) assert response.status_code == 200 assert not User.objects.filter(email="test_signup_disabled@example.org").exists() # Signup enabled config_system.signup_allowed = True response = client.get("/auth/signup/") assertContains(response, "", status_code=200) assertNotContains(response, "Not accepting new users at this time") @pytest.mark.django_db def test_signup_invite_only(client, config_system): """ Tests that invite codes work with signup """ config_system.signup_allowed = True config_system.signup_invite_only = True # Try to sign up without an invite code response = client.post("/auth/signup/", {"email": "random@example.com"}) assertNotContains(response, "Email Sent", status_code=200) # Make an invite code for any email invite_any = Invite.create_random() response = client.post( "/auth/signup/", {"email": "random@example.com", "invite_code": invite_any.token}, ) assertNotContains(response, "not a valid invite") assertContains(response, "Email Sent", status_code=200) # Make sure you can't reuse an invite code response = client.post( "/auth/signup/", {"email": "random2@example.com", "invite_code": invite_any.token}, ) assertNotContains(response, "Email Sent", status_code=200) # Make an invite code for a specific email invite_specific = Invite.create_random(email="special@example.com") response = client.post( "/auth/signup/", {"email": "random3@example.com", "invite_code": invite_specific.token}, ) assertContains(response, "valid invite code for this email", status_code=200) assertNotContains(response, "Email Sent") response = client.post( "/auth/signup/", {"email": "special@example.com", "invite_code": invite_specific.token}, ) assertContains(response, "Email Sent", status_code=200) @pytest.mark.django_db def test_signup_policy(client, config_system): """ Tests that you must agree to policies to sign up """ config_system.signup_allowed = True config_system.signup_invite_only = False # Make sure we can sign up when there are no policies response = client.post("/auth/signup/", {"email": "random@example.com"}) assertContains(response, "Email Sent", status_code=200) # Make sure that's then denied when we have a policy in place config_system.policy_rules = "You must love unit tests" response = client.post("/auth/signup/", {"email": "random2@example.com"}) assertContains(response, "field is required", status_code=200) assertNotContains(response, "Email Sent") @pytest.mark.django_db def test_signup_email(client, config_system, stator): """ Tests that you can sign up and get an email sent to you """ config_system.signup_allowed = True config_system.signup_invite_only = False # Sign up with a user response = client.post("/auth/signup/", {"email": "random@example.com"}) assertContains(response, "Email Sent", status_code=200) # Verify that made a user object and a password reset user = User.objects.get(email="random@example.com") assert user.password_resets.exists() # Run Stator and verify it sends the email assert len(mail.outbox) == 0 stator.run_single_cycle_sync() assert len(mail.outbox) == 1