def test_command(self): user = factories.UserFactory.create( email='*****@*****.**', password='******') project = factories.create_sample_project(user) self.assertFalse(project.statistics.exists()) Command().handle() self.assertTrue(project.statistics.exists())
def test_org_accept_invitation(self): user_a = UserFactory.create(email="*****@*****.**") user_b = UserFactory.create(email="*****@*****.**") org = create_sample_organization(user_a, org_kwargs={ 'name': u"My first org", }) project = create_sample_project(user_a, project_kwargs={'org': org}) auth = AuthorizationAssociation.objects.create(org=org, user=user_b, is_active=False, is_admin=True) project.add_user(user_b, is_active=False) project = Project.objects.get(pk=project.pk) self.assertFalse(project.can_read(user_b)) url = reverse("my_notifications") response = self.app.get(url, user=user_b) self.assertContains(response, org.name) form = response.forms['form_accept_{0}'.format(auth.pk)] response = form.submit().follow() self.assertContains(response, "You are now a member of this " "organization") auth = AuthorizationAssociation.objects.get(pk=auth.pk) self.assertTrue(auth.is_active) project = Project.objects.get(pk=project.pk) self.assertTrue(project.can_read(user_b))
def test_org_decline_invitation(self): user_a = UserFactory.create(email="*****@*****.**") user_b = UserFactory.create(email="*****@*****.**") org = create_sample_organization(user_a, org_kwargs={ 'name': u"My first org", }) project = create_sample_project(user_a, project_kwargs={'org': org}) auth = AuthorizationAssociation.objects.create(org=org, user=user_b, is_active=False, is_admin=True) auth_p = AuthorizationAssociation.objects.create(project=project, user=user_b, is_active=False, is_admin=True) url = reverse("my_notifications") response = self.app.get(url, user=user_b) self.assertContains(response, org.name) form = response.forms['form_decline_{0}'.format(auth.pk)] response = form.submit().follow() self.assertContains(response, "Invitation has been declined") auth_filter = AuthorizationAssociation.objects.filter(pk=auth.pk) self.assertFalse(auth_filter.exists()) auth_filter = AuthorizationAssociation.objects.filter(pk=auth_p.pk) self.assertFalse(auth_filter.exists())
def test_command(self): user = factories.UserFactory.create(email='*****@*****.**', password='******') project = factories.create_sample_project(user) self.assertFalse(project.statistics.exists()) Command().handle() self.assertTrue(project.statistics.exists())
def test_project_revoke_invitation(self): user_a = UserFactory.create(email="*****@*****.**") user_b = UserFactory.create(email="*****@*****.**", full_name="User B") project = create_sample_project(user_a, project_kwargs={ 'name': u"My first project", }) project.add_user(user_b) url = reverse("dashboard") response = self.app.get(url, user=user_b) self.assertContains(response, u"My first project") auth = AuthorizationAssociation.objects.get(project=project, user=user_b) url = reverse("project_auth_delete", args=(project.pk, auth.pk)) self.app.get(url, user=user_b, status=403) response = self.app.get(url, user=user_a) self.assertContains( response, u"Are you sure you want to revoke " u"'User B' from the project " u"'My first project'") form = response.forms['delete_form'] response = form.submit().follow() self.assertContains( response, 'User {0} has been revoked.'.format(user_b.email), ) url = reverse("dashboard") response = self.app.get(url, user=user_b) self.assertNotContains(response, u"My first project")
def test_org_decline_invitation(self): user_a = UserFactory.create(email="*****@*****.**") user_b = UserFactory.create(email="*****@*****.**") org = create_sample_organization(user_a, org_kwargs={ 'name': u"My first org", }) project = create_sample_project(user_a, project_kwargs={ 'org': org }) auth = AuthorizationAssociation.objects.create( org=org, user=user_b, is_active=False, is_admin=True ) auth_p = AuthorizationAssociation.objects.create( project=project, user=user_b, is_active=False, is_admin=True ) url = reverse("my_notifications") response = self.app.get(url, user=user_b) self.assertContains(response, org.name) form = response.forms['form_decline_{0}'.format(auth.pk)] response = form.submit().follow() self.assertContains(response, "Invitation has been declined") auth_filter = AuthorizationAssociation.objects.filter(pk=auth.pk) self.assertFalse(auth_filter.exists()) auth_filter = AuthorizationAssociation.objects.filter(pk=auth_p.pk) self.assertFalse(auth_filter.exists())
def test_org_accept_invitation(self): user_a = UserFactory.create(email="*****@*****.**") user_b = UserFactory.create(email="*****@*****.**") org = create_sample_organization(user_a, org_kwargs={ 'name': u"My first org", }) project = create_sample_project(user_a, project_kwargs={ 'org': org }) auth = AuthorizationAssociation.objects.create( org=org, user=user_b, is_active=False, is_admin=True ) project.add_user(user_b, is_active=False) project = Project.objects.get(pk=project.pk) self.assertFalse(project.can_read(user_b)) url = reverse("my_notifications") response = self.app.get(url, user=user_b) self.assertContains(response, org.name) form = response.forms['form_accept_{0}'.format(auth.pk)] response = form.submit().follow() self.assertContains(response, "You are now a member of this " "organization") auth = AuthorizationAssociation.objects.get(pk=auth.pk) self.assertTrue(auth.is_active) project = Project.objects.get(pk=project.pk) self.assertTrue(project.can_read(user_b))
def test_project_revoke_invitation(self): user_a = UserFactory.create(email="*****@*****.**") user_b = UserFactory.create(email="*****@*****.**") project = create_sample_project(user_a, project_kwargs={ 'name': u"My first project", }) project.add_user(user_b) url = reverse("dashboard") response = self.app.get(url, user=user_b) self.assertContains(response, u"My first project") auth = AuthorizationAssociation.objects.get( project=project, user=user_b ) url = reverse("project_auth_delete", args=(project.pk, auth.pk)) self.app.get(url, user=user_b, status=403) response = self.app.get(url, user=user_a) form = response.forms['delete_form'] response = form.submit().follow() self.assertContains( response, 'User {0} has been revoked.'.format(user_b.email), ) url = reverse("dashboard") response = self.app.get(url, user=user_b) self.assertNotContains(response, u"My first project")
def test_project_registration_cycle(self): user_a = UserFactory.create(email="*****@*****.**") user_b = UserFactory.create(email="*****@*****.**") user_c = UserFactory.create(email="*****@*****.**") project = create_sample_project(user_a, project_kwargs={ 'name': u"My first project", }) url = reverse('project_invite_user', args=(project.pk,)) # require login self.app.get(url, status=302) # not part of the project yet self.app.get(url, user=user_b, status=404) response = self.app.get(url, user=user_a) self.assertContains(response, 'Invite') form = response.forms['register_form'] # should handle uppercase email for key, value in { 'email': '*****@*****.**', }.iteritems(): form[key] = value response = form.submit().follow() self.assertContains(response, "Invitation has been sent") message = mail.outbox[-1] self.assertIn("*****@*****.**", message.to) self.assertTrue( message.body.find( "You have been invited to join the project") != -1 ) answer_url = line_starting(message.body, u"http://localhost:80/") response = self.app.get(answer_url, user=user_a, status=200) self.assertContains( response, u"You already accepted this invitation." ) response = self.app.get(answer_url, user=user_c, status=200) self.assertContains( response, u"This invitation does not match your current user" ) response = self.app.get(answer_url, user=user_b) self.assertContains( response, u"Invitation to project '{0}' has been".format(project.name) ) url = reverse("dashboard") response = self.app.get(url, user=user_b) self.assertContains(response, escape(project.name)) event = Event.objects.get( project=project ) self.assertEqual(event.text, "joined the project as team member") self.assertEqual(event.user, user_b)
def test_project_registration_cycle(self): user_a = UserFactory.create(email="*****@*****.**") user_b = UserFactory.create(email="*****@*****.**") user_c = UserFactory.create(email="*****@*****.**") project = create_sample_project(user_a, project_kwargs={ 'name': u"My first project", }) url = reverse('project_invite_user', args=(project.pk, )) # require login self.app.get(url, status=302) # not part of the project yet self.app.get(url, user=user_b, status=404) response = self.app.get(url, user=user_a) self.assertContains(response, 'Invite') form = response.forms['register_form'] # should handle uppercase email for key, value in { 'email': '*****@*****.**', }.iteritems(): form[key] = value response = form.submit().follow() self.assertContains(response, "Invitation has been sent") message = mail.outbox[-1] self.assertIn("*****@*****.**", message.to) self.assertTrue( message.body.find("You have been invited to join the project") != -1) answer_url = line_starting(message.body, u"http://localhost:80/") response = self.app.get(answer_url, user=user_a, status=200) self.assertContains(response, u"You already accepted this invitation.") response = self.app.get(answer_url, user=user_c, status=200) self.assertContains( response, u"This invitation does not match your current user") response = self.app.get(answer_url, user=user_b) self.assertContains( response, u"Invitation to project '{0}' has been".format(project.name)) url = reverse("dashboard") response = self.app.get(url, user=user_b) self.assertContains(response, escape(project.name)) event = Event.objects.get(project=project) self.assertEqual(event.text, "joined the project as team member") self.assertEqual(event.user, user_b)
def test_view(self): user = factories.UserFactory.create( email='*****@*****.**', password='******') project = factories.create_sample_project(user) backlog = factories.create_org_sample_backlog(user, backlog_kwargs={ 'project': project }) backlog_main = factories.create_org_sample_backlog( user, backlog_kwargs={ 'project': project, 'is_main': True, } ) factories.UserStoryFactory.create( project=project, backlog=backlog_main, points=22, status=Status.IN_PROGRESS, ) factories.UserStoryFactory.create( project=project, backlog=backlog_main, points=11, status=Status.TODO, ) factories.UserStoryFactory.create( project=project, backlog=backlog, points=10, status=Status.TODO, ) factories.UserStoryFactory.create( project=project, backlog=backlog, points=-1, status=Status.TODO, ) project.generate_daily_statistics() url = reverse("project_stats", args=(project.pk,)) self.app.get(url, status=302) response = self.app.get(url, user=user) self.assertContains(response, "Story points in project") self.assertContains(response, "Story points in main backlog")
def test_project_accept_invitation(self): user_a = UserFactory.create(email="*****@*****.**") user_b = UserFactory.create(email="*****@*****.**") project = create_sample_project(user_a, project_kwargs={ 'name': u"My first project", }) auth = AuthorizationAssociation.objects.create(project=project, user=user_b, is_active=False, is_admin=True) url = reverse("my_notifications") response = self.app.get(url, user=user_b) self.assertContains(response, project.name) form = response.forms['form_accept_{0}'.format(auth.pk)] response = form.submit().follow() self.assertContains(response, "You are now a member of this project") auth = AuthorizationAssociation.objects.get(pk=auth.pk) self.assertTrue(auth.is_active)
def test_view(self): user = factories.UserFactory.create(email='*****@*****.**', password='******') project = factories.create_sample_project(user) backlog = factories.create_org_sample_backlog( user, backlog_kwargs={'project': project}) backlog_main = factories.create_org_sample_backlog(user, backlog_kwargs={ 'project': project, 'is_main': True, }) factories.UserStoryFactory.create( project=project, backlog=backlog_main, points=22, status=Status.IN_PROGRESS, ) factories.UserStoryFactory.create( project=project, backlog=backlog_main, points=11, status=Status.TODO, ) factories.UserStoryFactory.create( project=project, backlog=backlog, points=10, status=Status.TODO, ) factories.UserStoryFactory.create( project=project, backlog=backlog, points=-1, status=Status.TODO, ) project.generate_daily_statistics() url = reverse("project_stats", args=(project.pk, )) self.app.get(url, status=302) response = self.app.get(url, user=user) self.assertContains(response, "Story points in project") self.assertContains(response, "Story points in main backlog")
def test_project_accept_invitation(self): user_a = UserFactory.create(email="*****@*****.**") user_b = UserFactory.create(email="*****@*****.**") project = create_sample_project(user_a, project_kwargs={ 'name': u"My first project", }) auth = AuthorizationAssociation.objects.create( project=project, user=user_b, is_active=False, is_admin=True ) url = reverse("my_notifications") response = self.app.get(url, user=user_b) self.assertContains(response, project.name) form = response.forms['form_accept_{0}'.format(auth.pk)] response = form.submit().follow() self.assertContains(response, "You are now a member of this project") auth = AuthorizationAssociation.objects.get(pk=auth.pk) self.assertTrue(auth.is_active)
def test_generate(self): user = factories.UserFactory.create( email='*****@*****.**', password='******') project = factories.create_sample_project(user) backlog = factories.create_org_sample_backlog(user, backlog_kwargs={ 'project': project }) backlog_main = factories.create_org_sample_backlog( user, backlog_kwargs={ 'project': project, 'is_main': True, } ) factories.UserStoryFactory.create( project=project, backlog=backlog_main, points=22, status=Status.IN_PROGRESS, ) factories.UserStoryFactory.create( project=project, backlog=backlog_main, points=11, status=Status.TODO, ) factories.UserStoryFactory.create( project=project, backlog=backlog, points=10, status=Status.TODO, ) story = factories.UserStoryFactory.create( project=project, backlog=backlog, points=-1, status=Status.TODO, ) project.generate_daily_statistics() self.assertEqual(project.statistics.count(), 1) project.generate_daily_statistics(timezone.now()) # not generated twice for the same day self.assertEqual(project.statistics.count(), 1) project.generate_daily_statistics(timezone.now() - timedelta(days=1)) # Same statistics data, should not create element self.assertEqual(project.statistics.count(), 1) story.status = Status.ACCEPTED story.save() project.generate_daily_statistics(timezone.now() - timedelta(days=1)) # statistics have changed, should had been generated. self.assertEqual(project.statistics.count(), 2) today_stats = project.statistics.get( day=timezone.now() ) data = today_stats.data self.assertEqual(data['backlogs'], 2) self.assertEqual(data['all']['points'], 22 + 11 + 10) self.assertEqual(data['all']['stories'], 4) self.assertEqual(data['all']['non_estimated'], 1) self.assertEqual(data['all']['by_status']['to_do']['points'], 10 + 11) self.assertEqual(data['all']['by_status']['to_do']['stories'], 3) self.assertEqual(data['all']['by_status']['in_progress']['points'], 22) self.assertEqual(data['all']['by_status']['in_progress']['stories'], 1) self.assertEqual(data['main']['points'], 22 + 11) self.assertEqual(data['main']['stories'], 2) self.assertEqual(data['main']['by_status']['to_do']['points'], 11) self.assertEqual(data['main']['by_status']['to_do']['stories'], 1)
def test_generate(self): user = factories.UserFactory.create(email='*****@*****.**', password='******') project = factories.create_sample_project(user) backlog = factories.create_org_sample_backlog( user, backlog_kwargs={'project': project}) backlog_main = factories.create_org_sample_backlog(user, backlog_kwargs={ 'project': project, 'is_main': True, }) factories.UserStoryFactory.create( project=project, backlog=backlog_main, points=22, status=Status.IN_PROGRESS, ) factories.UserStoryFactory.create( project=project, backlog=backlog_main, points=11, status=Status.TODO, ) factories.UserStoryFactory.create( project=project, backlog=backlog, points=10, status=Status.TODO, ) story = factories.UserStoryFactory.create( project=project, backlog=backlog, points=-1, status=Status.TODO, ) project.generate_daily_statistics() self.assertEqual(project.statistics.count(), 1) project.generate_daily_statistics(timezone.now()) # not generated twice for the same day self.assertEqual(project.statistics.count(), 1) project.generate_daily_statistics(timezone.now() - timedelta(days=1)) # Same statistics data, should not create element self.assertEqual(project.statistics.count(), 1) story.status = Status.ACCEPTED story.save() project.generate_daily_statistics(timezone.now() - timedelta(days=1)) # statistics have changed, should had been generated. self.assertEqual(project.statistics.count(), 2) today_stats = project.statistics.get(day=timezone.now()) data = today_stats.data self.assertEqual(data['backlogs'], 2) self.assertEqual(data['all']['points'], 22 + 11 + 10) self.assertEqual(data['all']['stories'], 4) self.assertEqual(data['all']['non_estimated'], 1) self.assertEqual(data['all']['by_status']['to_do']['points'], 10 + 11) self.assertEqual(data['all']['by_status']['to_do']['stories'], 3) self.assertEqual(data['all']['by_status']['in_progress']['points'], 22) self.assertEqual(data['all']['by_status']['in_progress']['stories'], 1) self.assertEqual(data['main']['points'], 22 + 11) self.assertEqual(data['main']['stories'], 2) self.assertEqual(data['main']['by_status']['to_do']['points'], 11) self.assertEqual(data['main']['by_status']['to_do']['stories'], 1)