diff --git a/projectroles/tests/test_views.py b/projectroles/tests/test_views.py index 958c5ac4..50722a5c 100644 --- a/projectroles/tests/test_views.py +++ b/projectroles/tests/test_views.py @@ -4275,7 +4275,7 @@ def test_post_local_users_email_domain_ldap(self): self.assertIsNotNone(invite) -# TODO: Refactor and cleanup tests +# TODO: Add testing for OIDC functionality once changed class TestProjectInviteAcceptView( ProjectMixin, RoleAssignmentMixin, ProjectInviteMixin, ViewTestBase ): @@ -4290,7 +4290,28 @@ def setUp(self): self.project, self.user, self.role_owner ) self.user_new = self.make_user('user_new') - self.project_url = reverse( + self.invite = self.make_invite( + email=INVITE_EMAIL, + project=self.project, + role=self.role_contributor, + issuer=self.user, + message='', + ) + self.url = reverse( + 'projectroles:invite_accept', + kwargs={'secret': self.invite.secret}, + ) + # TODO: Rename once view is renamed + self.url_process_ldap = reverse( + 'projectroles:invite_process_ldap', + kwargs={'secret': self.invite.secret}, + ) + # TODO: Rename once view is renamed + self.url_process_local = reverse( + 'projectroles:invite_process_local', + kwargs={'secret': self.invite.secret}, + ) + self.url_project = reverse( 'projectroles:detail', kwargs={'project': self.project.sodar_uuid}, ) @@ -4298,43 +4319,22 @@ def setUp(self): @override_settings(ENABLE_LDAP=True, AUTH_LDAP_USERNAME_DOMAIN=LDAP_DOMAIN) def test_get_ldap(self): """Test ProjectInviteAcceptView GET with LDAP invite""" - invite = self.make_invite( - email=INVITE_EMAIL, - project=self.project, - role=self.role_contributor, - issuer=self.user, - message='', - ) self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) self.assertEqual( RoleAssignment.objects.filter( - project=self.project, - user=self.user_new, - role=self.role_contributor, + project=self.project, user=self.user_new ).count(), 0, ) self.assertEqual(len(mail.outbox), 0) with self.login(self.user_new): - response = self.client.get( - reverse( - 'projectroles:invite_accept', - kwargs={'secret': invite.secret}, - ), - follow=True, - ) + response = self.client.get(self.url, follow=True) self.assertListEqual( response.redirect_chain, [ - ( - reverse( - 'projectroles:invite_process_ldap', - kwargs={'secret': invite.secret}, - ), - 302, - ), - (self.project_url, 302), + (self.url_process_ldap, 302), + (self.url_project, 302), ], ) self.assertEqual( @@ -4348,9 +4348,7 @@ def test_get_ldap(self): self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 0) self.assertEqual( RoleAssignment.objects.filter( - project=self.project, - user=self.user_new, - role=self.role_contributor, + project=self.project, user=self.user_new ).count(), 1, ) @@ -4368,20 +4366,8 @@ def test_get_ldap(self): def test_get_ldap_disable_email(self): """Test GET with LDAP invite and disabled email notifications""" app_settings.set(APP_NAME, 'notify_email_role', False, user=self.user) - invite = self.make_invite( - email=INVITE_EMAIL, - project=self.project, - role=self.role_contributor, - issuer=self.user, - message='', - ) with self.login(self.user_new): - self.client.get( - reverse( - 'projectroles:invite_accept', - kwargs={'secret': invite.secret}, - ), - ) + self.client.get(self.url) self.assertEqual(len(mail.outbox), 0) @override_settings( @@ -4392,149 +4378,88 @@ def test_get_ldap_disable_email(self): ) def test_get_ldap_alt_domain(self): """Test GET with LDAP invite and email in LDAP_ALT_DOMAINS""" - alt_email = 'user@alt.org' - invite = self.make_invite( - email=alt_email, - project=self.project, - role=self.role_contributor, - issuer=self.user, - message='', - ) + self.invite.email = 'user@alt.org' + self.invite.save() self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) self.assertEqual( RoleAssignment.objects.filter( - project=self.project, - user=self.user_new, - role=self.role_contributor, + project=self.project, user=self.user_new ).count(), 0, ) with self.login(self.user_new): - response = self.client.get( - reverse( - 'projectroles:invite_accept', - kwargs={'secret': invite.secret}, - ), - follow=True, - ) + response = self.client.get(self.url, follow=True) self.assertListEqual( response.redirect_chain, [ - ( - reverse( - 'projectroles:invite_process_ldap', - kwargs={'secret': invite.secret}, - ), - 302, - ), - (self.project_url, 302), + (self.url_process_ldap, 302), + (self.url_project, 302), ], ) self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 0) self.assertEqual( RoleAssignment.objects.filter( - project=self.project, - user=self.user_new, - role=self.role_contributor, + project=self.project, user=self.user_new ).count(), 1, ) @override_settings( - AUTH_LDAP_USERNAME_DOMAIN=LDAP_DOMAIN, ENABLE_LDAP=True, - LDAP_ALT_DOMAINS=[], + AUTH_LDAP_USERNAME_DOMAIN=LDAP_DOMAIN, PROJECTROLES_ALLOW_LOCAL_USERS=False, ) def test_get_ldap_email_not_listed(self): """Test GET with LDAP invite and email not in LDAP_ALT_DOMAINS""" - alt_email = 'user@alt.org' - invite = self.make_invite( - email=alt_email, - project=self.project, - role=self.role_contributor, - issuer=self.user, - message='', - ) + self.invite.email = 'user@alt.org' + self.invite.save() self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) self.assertEqual( RoleAssignment.objects.filter( - project=self.project, - user=self.user_new, - role=self.role_contributor, + project=self.project, user=self.user_new ).count(), 0, ) with self.login(self.user_new): - response = self.client.get( - reverse( - 'projectroles:invite_accept', - kwargs={'secret': invite.secret}, - ), - follow=True, - ) + response = self.client.get(self.url, follow=True) self.assertListEqual(response.redirect_chain, [(reverse('home'), 302)]) self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) self.assertEqual( RoleAssignment.objects.filter( - project=self.project, - user=self.user_new, - role=self.role_contributor, + project=self.project, user=self.user_new ).count(), 0, ) - @override_settings(AUTH_LDAP_USERNAME_DOMAIN=LDAP_DOMAIN, ENABLE_LDAP=True) + @override_settings(ENABLE_LDAP=True, AUTH_LDAP_USERNAME_DOMAIN=LDAP_DOMAIN) def test_get_ldap_expired(self): """Test GET with expired LDAP invite""" - invite = self.make_invite( - email=INVITE_EMAIL, - project=self.project, - role=self.role_contributor, - issuer=self.user, - message='', - date_expire=timezone.now(), - ) + self.invite.date_expire = timezone.now() + self.invite.save() self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) self.assertEqual( RoleAssignment.objects.filter( - project=self.project, - user=self.user_new, - role=self.role_contributor, + project=self.project, user=self.user_new ).count(), 0, ) self.assertEqual(len(mail.outbox), 0) with self.login(self.user_new): - response = self.client.get( - reverse( - 'projectroles:invite_accept', - kwargs={'secret': invite.secret}, - ), - follow=True, - ) + response = self.client.get(self.url, follow=True) self.assertListEqual( response.redirect_chain, [ - ( - reverse( - 'projectroles:invite_process_ldap', - kwargs={'secret': invite.secret}, - ), - 302, - ), + (self.url_process_ldap, 302), (reverse('home'), 302), ], ) self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 0) self.assertEqual( RoleAssignment.objects.filter( - project=self.project, - user=self.user_new, - role=self.role_contributor, + project=self.project, user=self.user_new ).count(), 0, ) @@ -4547,150 +4472,38 @@ def test_get_ldap_expired(self): mail.outbox[0].subject, ) - @override_settings(AUTH_LDAP_USERNAME_DOMAIN=LDAP_DOMAIN, ENABLE_LDAP=True) + @override_settings(ENABLE_LDAP=True, AUTH_LDAP_USERNAME_DOMAIN=LDAP_DOMAIN) def test_get_ldap_expired_disable_email(self): """Test GET with expired LDAP invite and disabled email notifications""" app_settings.set(APP_NAME, 'notify_email_role', False, user=self.user) - invite = self.make_invite( - email=INVITE_EMAIL, - project=self.project, - role=self.role_contributor, - issuer=self.user, - message='', - date_expire=timezone.now(), - ) + self.invite.date_expire = timezone.now() + self.invite.save() with self.login(self.user_new): - self.client.get( - reverse( - 'projectroles:invite_accept', - kwargs={'secret': invite.secret}, - ), - follow=True, - ) + self.client.get(self.url, follow=True) self.assertEqual(len(mail.outbox), 0) - @override_settings(PROJECTROLES_ALLOW_LOCAL_USERS=True) def test_get_local(self): """Test GET with local invite and nonexistent user with no user logged in""" - invite = self.make_invite( - email=INVITE_EMAIL, - project=self.project, - role=self.role_contributor, - issuer=self.user, - message='', - ) self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) + response = self.client.get(self.url, follow=True) + self.assertRedirects(response, self.url_process_local) - response = self.client.get( - reverse( - 'projectroles:invite_accept', - kwargs={'secret': invite.secret}, - ), - follow=True, - ) - self.assertRedirects( - response, - reverse( - 'projectroles:invite_process_local', - kwargs={'secret': invite.secret}, - ), - ) - - response = self.client.get( - reverse( - 'projectroles:invite_process_local', - kwargs={'secret': invite.secret}, - ), - ) - self.assertEqual(response.context['invite'], invite) - email = response.context['form']['email'].value() - username = response.context['form']['username'].value() - self.assertEqual(email, invite.email) - self.assertEqual(username, invite.email.split('@')[0]) - self.assertEqual(User.objects.count(), 2) - - # NOTE: We must face HTTP_REFERER here for it to be included - response = self.client.post( - reverse( - 'projectroles:invite_process_local', - kwargs={'secret': invite.secret}, - ), - data={ - 'first_name': 'First', - 'last_name': 'Last', - 'username': username, - 'email': email, - 'password': 'asd', - 'password_confirm': 'asd', - }, - follow=True, - HTTP_REFERER=reverse( - 'projectroles:invite_process_local', - kwargs={'secret': invite.secret}, - ), - ) - self.assertListEqual( - response.redirect_chain, - [ - (self.project_url, 302), - (reverse('login') + '?next=' + self.project_url, 302), - ], - ) - self.assertEqual( - list(get_messages(response.wsgi_request))[1].message, LOGIN_MSG - ) - user = User.objects.get(username=username) - self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 0) - self.assertEqual( - RoleAssignment.objects.filter( - project=self.project, - user=user, - role=self.role_contributor, - ).count(), - 1, - ) - with self.login(user, password='asd'): - response = self.client.get(self.project_url) - self.assertEqual(response.status_code, 200) - - @override_settings(PROJECTROLES_ALLOW_LOCAL_USERS=True) def test_get_expired_local(self): """Test GET with expired local invite""" - invite = self.make_invite( - email=INVITE_EMAIL, - project=self.project, - role=self.role_contributor, - issuer=self.user, - message='', - date_expire=timezone.now(), - ) + self.invite.date_expire = timezone.now() + self.invite.save() self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) self.assertEqual( RoleAssignment.objects.filter( - project=self.project, - user=self.user_new, - role=self.role_contributor, + project=self.project, user=self.user_new ).count(), 0, ) - - response = self.client.get( - reverse( - 'projectroles:invite_accept', - kwargs={'secret': invite.secret}, - ), - follow=True, - ) + response = self.client.get(self.url, follow=True) self.assertListEqual( response.redirect_chain, [ - ( - reverse( - 'projectroles:invite_process_local', - kwargs={'secret': invite.secret}, - ), - 302, - ), + (self.url_process_local, 302), (reverse('home'), 302), (reverse('login') + '?next=/', 302), ], @@ -4698,69 +4511,128 @@ def test_get_expired_local(self): self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 0) self.assertEqual( RoleAssignment.objects.filter( - project=self.project, - user=self.user_new, - role=self.role_contributor, + project=self.project, user=self.user_new ).count(), 0, ) - @override_settings( - ENABLE_LDAP=True, - PROJECTROLES_ALLOW_LOCAL_USERS=True, - AUTH_LDAP_USERNAME_DOMAIN=LDAP_DOMAIN, - AUTH_LDAP_DOMAIN_PRINTABLE=LDAP_DOMAIN, - ) - def test_get_process_ldap_wrong_type_local(self): - """Test ProjectInviteProcessLDAPView GET with local invite""" - invite = self.make_invite( - email='test@different.com', + @override_settings(PROJECTROLES_ALLOW_LOCAL_USERS=False) + def test_get_local_user_disabled(self): + """Test GET with local users disabled""" + self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) + response = self.client.get(self.url, follow=True) + self.assertListEqual( + response.redirect_chain, + [(reverse('home'), 302), (reverse('login') + '?next=/', 302)], + ) + + def test_get_role_exists(self): + """Test GET for user with roles in project""" + invited_user = self.make_user(INVITE_EMAIL.split('@')[0]) + invited_user.email = INVITE_EMAIL + invited_user.save() + self.make_assignment(self.project, invited_user, self.role_guest) + self.assertTrue(self.invite.active) + self.assertIsNone( + TimelineEvent.objects.filter(event_name='invite_accept').first() + ) + with self.login(invited_user): + response = self.client.get(self.url, follow=True) + self.assertRedirects(response, self.url_project) + self.invite.refresh_from_db() + self.assertFalse(self.invite.active) + # No timeline event should be created + self.assertIsNone( + TimelineEvent.objects.filter(event_name='invite_accept').first() + ) + + # TODO: Test redirecting to login view if OIDC enabled but local isn't + + +class TestProjectInviteProcessLDAPView( + ProjectMixin, RoleAssignmentMixin, ProjectInviteMixin, ViewTestBase +): + """Tests for ProjectInviteProcessLDAPView""" + + def setUp(self): + super().setUp() + self.project = self.make_project( + 'TestProject', PROJECT_TYPE_PROJECT, None + ) + self.owner_as = self.make_assignment( + self.project, self.user, self.role_owner + ) + self.user_new = self.make_user('user_new') + self.invite = self.make_invite( + email=INVITE_EMAIL, project=self.project, role=self.role_contributor, issuer=self.user, message='', ) - self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) - response = self.client.get( - reverse( - 'projectroles:invite_process_ldap', - kwargs={'secret': invite.secret}, - ), + self.url_process_ldap = reverse( + 'projectroles:invite_process_ldap', + kwargs={'secret': self.invite.secret}, ) + + @override_settings(ENABLE_LDAP=True, AUTH_LDAP_USERNAME_DOMAIN=LDAP_DOMAIN) + def test_get_wrong_type_local(self): + """Test ProjectInviteProcessLDAPView GET with local invite""" + self.invite.email = 'test@different.com' + self.invite.save() + self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) + response = self.client.get(self.url_process_ldap) # LDAP expects user to be logged in self.assertRedirects( - response, - reverse('login') - + '?next=' - + reverse( - 'projectroles:invite_process_ldap', - kwargs={'secret': invite.secret}, - ), + response, reverse('login') + '?next=' + self.url_process_ldap ) - @override_settings( - ENABLE_LDAP=True, - PROJECTROLES_ALLOW_LOCAL_USERS=True, - AUTH_LDAP_USERNAME_DOMAIN=LDAP_DOMAIN, - AUTH_LDAP_DOMAIN_PRINTABLE=LDAP_DOMAIN, - ) - def test_get_process_local_wrong_type_ldap(self): - """Test ProjectInviteProcessLocalView GET with LDAP invite""" - invite = self.make_invite( + +class TestProjectInviteProcessLocalView( + ProjectMixin, RoleAssignmentMixin, ProjectInviteMixin, ViewTestBase +): + """Tests for ProjectInviteProcessLocalView""" + + def setUp(self): + super().setUp() + self.project = self.make_project( + 'TestProject', PROJECT_TYPE_PROJECT, None + ) + self.owner_as = self.make_assignment( + self.project, self.user, self.role_owner + ) + self.user_new = self.make_user('user_new') + self.invite = self.make_invite( email=INVITE_EMAIL, project=self.project, role=self.role_contributor, issuer=self.user, message='', ) - self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) - response = self.client.get( - reverse( - 'projectroles:invite_process_local', - kwargs={'secret': invite.secret}, - ), - follow=True, + self.url = reverse( + 'projectroles:invite_process_local', + kwargs={'secret': self.invite.secret}, ) + self.url_project = reverse( + 'projectroles:detail', + kwargs={'project': self.project.sodar_uuid}, + ) + + def test_get(self): + """Test ProjectInviteProcessLocalView GET""" + self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) + response = self.client.get(self.url) + self.assertEqual(response.context['invite'], self.invite) + email = response.context['form']['email'].value() + username = response.context['form']['username'].value() + self.assertEqual(email, self.invite.email) + self.assertEqual(username, self.invite.email.split('@')[0]) + + @override_settings(ENABLE_LDAP=True, AUTH_LDAP_USERNAME_DOMAIN=LDAP_DOMAIN) + def test_get_wrong_type_ldap(self): + """Test ProjectInviteProcessLocalView GET with LDAP invite""" + self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) + response = self.client.get(self.url, follow=True) self.assertRedirects( response, reverse('login') + '?next=' + reverse('home') ) @@ -4770,46 +4642,10 @@ def test_get_process_local_wrong_type_ldap(self): ) @override_settings(PROJECTROLES_ALLOW_LOCAL_USERS=False) - def test_get_local_user_disabled(self): + def test_get_local_users_disabled(self): """Test GET with local users disabled""" - invite = self.make_invite( - email=INVITE_EMAIL, - project=self.project, - role=self.role_contributor, - issuer=self.user, - message='', - ) self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) - response = self.client.get( - reverse( - 'projectroles:invite_accept', - kwargs={'secret': invite.secret}, - ), - follow=True, - ) - self.assertListEqual( - response.redirect_chain, - [(reverse('home'), 302), (reverse('login') + '?next=/', 302)], - ) - - @override_settings(PROJECTROLES_ALLOW_LOCAL_USERS=False) - def test_get_process_local_disabled(self): - """Test ProjectInviteProcessLocalView GET with local users disabled""" - invite = self.make_invite( - email=INVITE_EMAIL, - project=self.project, - role=self.role_contributor, - issuer=self.user, - message='', - ) - self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) - response = self.client.get( - reverse( - 'projectroles:invite_process_local', - kwargs={'secret': invite.secret}, - ), - follow=True, - ) + response = self.client.get(self.url, follow=True) self.assertRedirects( response, reverse('login') + '?next=' + reverse('home') ) @@ -4818,82 +4654,53 @@ def test_get_process_local_disabled(self): INVITE_LOCAL_NOT_ALLOWED_MSG, ) - @override_settings(PROJECTROLES_ALLOW_LOCAL_USERS=True) - def test_get_process_local_no_user_different_user_logged(self): - """Test ProjectInviteProcessLocalView GET with nonexistent user and different user logged in""" - invite = self.make_invite( - email=INVITE_EMAIL, - project=self.project, - role=self.role_contributor, - issuer=self.user, - message='', - ) + def test_get_no_user_different_user_logged(self): + """Test GET with nonexistent user and different user logged in""" self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) with self.login(self.user): - response = self.client.get( - reverse( - 'projectroles:invite_process_local', - kwargs={'secret': invite.secret}, - ), - follow=True, - ) + response = self.client.get(self.url, follow=True) self.assertRedirects(response, reverse('home')) self.assertEqual( list(get_messages(response.wsgi_request))[0].message, INVITE_LOGGED_IN_ACCEPT_MSG, ) - @override_settings(PROJECTROLES_ALLOW_LOCAL_USERS=True) - def test_get_process_local_user_exists_different_user_logged(self): - """Test ProjectInviteProcessLocalView GET with existing user and different user logged in""" + def test_get_user_exists_different_user_logged(self): + """Test GET with existing user and different user logged in""" invited_user = self.make_user(INVITE_EMAIL.split('@')[0]) invited_user.email = INVITE_EMAIL invited_user.save() - invite = self.make_invite( - email=INVITE_EMAIL, - project=self.project, - role=self.role_contributor, - issuer=self.user, - message='', - ) self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) with self.login(self.user): - response = self.client.get( - reverse( - 'projectroles:invite_process_local', - kwargs={'secret': invite.secret}, - ), - follow=True, - ) + response = self.client.get(self.url, follow=True) self.assertRedirects(response, reverse('home')) self.assertEqual( list(get_messages(response.wsgi_request))[0].message, INVITE_USER_NOT_EQUAL_MSG, ) - @override_settings(PROJECTROLES_ALLOW_LOCAL_USERS=True) - def test_get_process_local_user_exists_is_logged(self): - """Test ProjectInviteProcessLocalView GET with with existing and logged in user""" + def test_get_user_exists_not_logged(self): + """Test ProjectInviteProcessLocalView GET with existing user and no user logged in""" invited_user = self.make_user(INVITE_EMAIL.split('@')[0]) invited_user.email = INVITE_EMAIL invited_user.save() - invite = self.make_invite( - email=INVITE_EMAIL, - project=self.project, - role=self.role_contributor, - issuer=self.user, - message='', + self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) + response = self.client.get(self.url, follow=True) + self.assertRedirects(response, reverse('login') + '?next=' + self.url) + self.assertEqual( + list(get_messages(response.wsgi_request))[0].message, + INVITE_USER_EXISTS_MSG, ) + + def test_get_user_exists_is_logged(self): + """Test GET with with existing and logged in user""" + invited_user = self.make_user(INVITE_EMAIL.split('@')[0]) + invited_user.email = INVITE_EMAIL + invited_user.save() self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) with self.login(invited_user): - response = self.client.get( - reverse( - 'projectroles:invite_process_local', - kwargs={'secret': invite.secret}, - ), - follow=True, - ) - self.assertRedirects(response, self.project_url) + response = self.client.get(self.url, follow=True) + self.assertRedirects(response, self.url_project) self.assertEqual( list(get_messages(response.wsgi_request))[0].message, PROJECT_WELCOME_MSG.format( @@ -4903,79 +4710,42 @@ def test_get_process_local_user_exists_is_logged(self): ), ) - @override_settings(PROJECTROLES_ALLOW_LOCAL_USERS=True) - def test_get_process_local_user_exists_not_logged(self): - """Test ProjectInviteProcessLocalView GET with existing user and no user logged in""" - invited_user = self.make_user(INVITE_EMAIL.split('@')[0]) - invited_user.email = INVITE_EMAIL - invited_user.save() - invite = self.make_invite( - email=INVITE_EMAIL, - project=self.project, - role=self.role_contributor, - issuer=self.user, - message='', - ) - self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 1) - response = self.client.get( - reverse( - 'projectroles:invite_process_local', - kwargs={'secret': invite.secret}, - ), + def test_post(self): + """Test POST""" + # NOTE: We must set HTTP_REFERER here for it to be included + response = self.client.post( + self.url, + data={ + 'first_name': 'First', + 'last_name': 'Last', + 'username': 'test', + 'email': INVITE_EMAIL, + 'password': 'asd', + 'password_confirm': 'asd', + }, follow=True, + HTTP_REFERER=self.url, ) - self.assertRedirects( - response, - reverse( - 'login', - ) - + '?next=' - + reverse( - 'projectroles:invite_process_local', - kwargs={'secret': invite.secret}, - ), + self.assertListEqual( + response.redirect_chain, + [ + (self.url_project, 302), + (reverse('login') + '?next=' + self.url_project, 302), + ], ) self.assertEqual( - list(get_messages(response.wsgi_request))[0].message, - INVITE_USER_EXISTS_MSG, - ) - - def test_get_role_exists(self): - """Test GET for user with roles in project""" - invited_user = self.make_user(INVITE_EMAIL.split('@')[0]) - invited_user.email = INVITE_EMAIL - invited_user.save() - invite = self.make_invite( - email=INVITE_EMAIL, - project=self.project, - role=self.role_contributor, - issuer=self.user, - message='', - ) - self.make_assignment(self.project, invited_user, self.role_guest) - self.assertTrue(invite.active) - self.assertIsNone( - TimelineEvent.objects.filter(event_name='invite_accept').first() + list(get_messages(response.wsgi_request))[1].message, LOGIN_MSG ) - - with self.login(invited_user): - response = self.client.get( - reverse( - 'projectroles:invite_accept', - kwargs={'secret': invite.secret}, - ), - follow=True, - ) - self.assertRedirects(response, self.project_url) - invite.refresh_from_db() - self.assertFalse(invite.active) - # No timeline event should be created - self.assertIsNone( - TimelineEvent.objects.filter(event_name='invite_accept').first() + user = User.objects.get(username='test') + self.assertEqual(ProjectInvite.objects.filter(active=True).count(), 0) + self.assertIsNotNone( + RoleAssignment.objects.filter( + project=self.project, + user=user, + role=self.role_contributor, + ).first() ) - # TODO: Test redirecting to login view if OIDC enabled but local isn't - class TestProjectInviteListView( ProjectMixin, RoleAssignmentMixin, ProjectInviteMixin, ViewTestBase diff --git a/projectroles/urls.py b/projectroles/urls.py index 92947f92..4e9af071 100644 --- a/projectroles/urls.py +++ b/projectroles/urls.py @@ -94,11 +94,13 @@ view=views.ProjectInviteAcceptView.as_view(), name='invite_accept', ), + # TODO: Change route and name path( route='invites/process/ldap/', - view=views.ProjectInviteProcessLoggedInView.as_view(), + view=views.ProjectInviteProcessLDAPView.as_view(), name='invite_process_ldap', ), + # TODO: Change route and name path( route='invites/process/local/', view=views.ProjectInviteProcessLocalView.as_view(), diff --git a/projectroles/views.py b/projectroles/views.py index 9e696971..eb2b01a3 100644 --- a/projectroles/views.py +++ b/projectroles/views.py @@ -2762,7 +2762,7 @@ def get(self, *args, **kwargs): return redirect(reverse('home')) -class ProjectInviteProcessLoggedInView( +class ProjectInviteProcessLDAPView( LoginRequiredMixin, ProjectInviteProcessMixin, View ): """ @@ -2810,6 +2810,7 @@ def get(self, *args, **kwargs): ) +# TODO: Rename view class ProjectInviteProcessLocalView(ProjectInviteProcessMixin, FormView): """View to handle accepting a project local invite"""