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")
Example #14
0
 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)