def test_search_measurement3(self):
     """
     Should return one measurement that matches the rating, assessment combo.
     One measurement relates to an assessment that is not in the scope of the search.
     """
     template1 = TemplateFactory()
     template2 = TemplateFactory()
     attribute1 = AttributeFactory(template=template1)
     attribute2 = AttributeFactory(template=template2)
     rating = RatingFactory(attribute=attribute1)
     assessment1 = AssessmentFactory(template=template1)
     assessment2 = AssessmentFactory(template=template2)
     measurement1 = MeasurementFactory(assessment=assessment1,
                                       attribute=attribute1,
                                       rating=rating)
     measurement2 = MeasurementFactory(assessment=assessment2,
                                       attribute=attribute2,
                                       rating=rating)
     url = "%s?assessment__id=%s&rating__attribute=%s" % (
         reverse('measurement-list'), assessment1.id, attribute1.id)
     response = self.client.get(url)
     self.assertEqual(response.status_code, status.HTTP_200_OK)
     self.assertEqual(response.data[0]['id'], measurement1.id)
     self.assertEqual(response.data[0]['rating'], rating.id)
     self.assertEqual(len(response.data), 1)
 def test_creation_of_assessment(self):
     template = TemplateFactory()
     team = TeamFactory()
     assessment = AssessmentFactory(template=template, team=team)
     assessment.clean()
     self.assertEqual(
         "%s - %s - %d" % (team.name, template.name, assessment.id),
         str(assessment))
    def test_list_assessment_count(self):
        """
        Ensure multiple assessments are returned in a list
        and sorted by last first
        """
        assessment1 = AssessmentFactory()
        assessment2 = AssessmentFactory()

        url = reverse('assessment-list')
        response = self.client.get(url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data), Assessment.objects.count())
        self.assertEqual(response.data[0]['id'], assessment2.id)
        self.assertEqual(response.data[1]['id'], assessment1.id)
    def test_update_target_rating_to_measurement(self):
        """
        Ensure we can update an existing measurement object with a target rating
        """
        assessment = AssessmentFactory()
        rating = RatingFactory()
        target_rating = RatingFactory(attribute=rating.attribute)
        measurement = MeasurementFactory(assessment=assessment,
                                         attribute=rating.attribute,
                                         rating=rating)

        url = reverse('measurement-detail', args=(measurement.id, ))
        data = {
            "id": measurement.id,
            "assessment": assessment.id,
            "attribute": rating.attribute.id,
            "rating": rating.id,
            "target_rating": target_rating.id,
            "observations": "123",
            "action": "456"
        }
        response = self.client.put(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(Measurement.objects.count(), 1)
        self.assertEqual(response.data['id'], measurement.id)
        self.assertEqual(response.data['target_rating'], target_rating.id)
    def test_create_measurement_success_assessment_read_only_super_user(self):
        """
        Ensure we can create a new measurement when the assessment is read only and superuser
        """

        password = '******'
        my_admin = User.objects.create_superuser('myuser', '*****@*****.**',
                                                 password)

        self.client.login(username=my_admin.username, password=password)

        assessment = AssessmentFactory(status="DONE")
        rating = RatingFactory()
        url = reverse('measurement-list')
        data = {
            "id": None,
            "assessment": assessment.id,
            "attribute": rating.attribute.id,
            "rating": rating.id,
            "observations": None,
            "action": "456"
        }
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(Measurement.objects.count(), 1)
    def test_list_assessment(self):
        """
        List all assessments and check that all fields are returned
        """
        assessment1 = AssessmentFactory()

        url = reverse('assessment-list')
        response = self.client.get(url)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data[0]['id'], assessment1.id)
        self.assertEqual(response.data[0]['template']['name'],
                         assessment1.template.name)
        self.assertEqual(response.data[0]['template']['id'],
                         assessment1.template.id)
        self.assertEqual(response.data[0]['team']['name'],
                         assessment1.team.name)
        self.assertEqual(response.data[0]['team']['id'], assessment1.team.id)
        self.assertEqual(
            datetime.datetime.strptime(response.data[0]['created'],
                                       '%Y-%m-%dT%H:%M:%S.%fZ'),
            assessment1.created.replace(tzinfo=None))
        self.assertEqual(
            datetime.datetime.strptime(response.data[0]['updated'],
                                       '%Y-%m-%dT%H:%M:%S.%fZ'),
            assessment1.updated.replace(tzinfo=None))
    def test_can_delete_measurement_when_assessment_is_read_only_and_super_user(
            self):
        """
        Ensure we can delete an existing measurement object when assessment is read only and you are superuser
        """
        assessment = AssessmentFactory(status="DONE")
        rating = RatingFactory()
        target_rating = RatingFactory(attribute=rating.attribute)
        measurement = MeasurementFactory(assessment=assessment,
                                         attribute=rating.attribute,
                                         rating=rating)

        password = '******'
        my_admin = User.objects.create_superuser('myuser', '*****@*****.**',
                                                 password)

        self.client.login(username=my_admin.username, password=password)

        url = reverse('measurement-detail', args=(measurement.id, ))
        data = {
            "id": measurement.id,
            "assessment": assessment.id,
            "attribute": rating.attribute.id,
            "rating": rating.id,
            "target_rating": target_rating.id,
            "observations": "123",
            "action": "456"
        }
        response = self.client.delete(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
        self.assertEqual(Measurement.objects.count(), 0)
    def test_halt_updates_if_read_only_non_super_user(self):
        """
        Ensure you can't update the assessment if you're not a superadmin and status is done.
        """
        assessment = AssessmentFactory(status="DONE")

        url = reverse('assessment-detail', args=(assessment.id,))
        data = {"id": assessment.id, "template": assessment.template.id, "status": "TODO", "tags": []}
        response = self.client.put(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
        self.assertEqual(Assessment.objects.count(), 1)
    def test_update_status_to_done(self):
        """
        Ensure even anonymous users can make an assessment done.
        """
        assessment = AssessmentFactory()

        url = reverse('assessment-detail', args=(assessment.id,))
        data = {"id": assessment.id, "template": assessment.template.id, "status": "DONE", "tags": []}
        response = self.client.put(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(Assessment.objects.count(), 1)
        self.assertEqual(Assessment.objects.get(pk=assessment.id).status, "DONE")
 def test_search_measurement2(self):
     """
     Should return zero measurements as the api search is for a different assessment
     """
     template = TemplateFactory()
     attribute = AttributeFactory(template=template)
     rating_in_scope1 = RatingFactory(attribute=attribute)
     rating_in_scope2 = RatingFactory(attribute=attribute)
     assessment1 = AssessmentFactory(template=template)
     assessment2 = AssessmentFactory(template=template)
     assessment3 = AssessmentFactory()
     measurement1 = MeasurementFactory(assessment=assessment1,
                                       attribute=attribute,
                                       rating=rating_in_scope1)
     measurement2 = MeasurementFactory(assessment=assessment2,
                                       attribute=attribute,
                                       rating=rating_in_scope2)
     url = "%s?assessment__id=%s&rating__attribute=%s" % (
         reverse('measurement-list'), assessment3.id, attribute.id)
     response = self.client.get(url)
     self.assertEqual(response.status_code, status.HTTP_200_OK)
     self.assertEqual(len(response.data), 0)
    def test_do_not_halt_deletes_if_read_only_super_user(self):
        """
        Ensure you can delete the assessment if you are a superadmin and status is done.
        """
        assessment = AssessmentFactory(status="DONE")

        password = '******'
        my_admin = User.objects.create_superuser('myuser', '*****@*****.**', password)

        self.client.login(username=my_admin.username, password=password)

        url = reverse('assessment-detail', args=(assessment.id,))
        data = {"id": assessment.id, "template": assessment.template.id, "status": "TODO", "tags": []}
        response = self.client.delete(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
        self.assertEqual(Assessment.objects.count(), 0)
 def test_creation_of_measurement_no_target(self):
     """
     Should be able to create a measurement without a target_rating
     """
     template = TemplateFactory()
     attribute = AttributeFactory(template=template)
     assessment = AssessmentFactory(template=template)
     rating = RatingFactory(attribute=attribute)
     measurement = MeasurementFactory(assessment=assessment,
                                      attribute=attribute,
                                      rating=rating)
     measurement.clean()
     self.assertEqual(1, Measurement.objects.count())
     self.assertEqual(
         "%s - %s - %s" % (str(assessment), attribute.name, rating.name),
         str(measurement))
    def test_update_tags(self):
        """
        Ensure you can update the tags
        """
        tag1 = TagFactory()
        tag2 = TagFactory()
        assessment = AssessmentFactory(tags=[tag1, tag2])

        tag3 = TagFactory()

        url = reverse('assessment-detail', args=(assessment.id,))
        data = {"id": assessment.id, "template": assessment.template.id, "status": assessment.status,
                "tags": [tag1.id, tag3.id]}
        response = self.client.put(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data['id'], data['id'])
        self.assertEqual(len(response.data['tags']), 2)
        self.assertCountEqual(response.data['tags'], [tag1.id, tag3.id])
 def test_create_measurement_fail_assessment_read_only(self):
     """
     Ensure we cannot create a new measurement when the assessment is read only
     """
     assessment = AssessmentFactory(status="DONE")
     rating = RatingFactory()
     url = reverse('measurement-list')
     data = {
         "id": None,
         "assessment": assessment.id,
         "attribute": rating.attribute.id,
         "rating": rating.id,
         "observations": None,
         "action": "456"
     }
     response = self.client.post(url, data, format='json')
     self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
     self.assertEqual(Measurement.objects.count(), 0)
 def test_create_measurement_no_action(self):
     """
     Ensure we can create a new measurement object without an action.
     """
     assessment = AssessmentFactory()
     rating = RatingFactory()
     url = reverse('measurement-list')
     data = {
         "id": None,
         "assessment": assessment.id,
         "attribute": rating.attribute.id,
         "rating": rating.id,
         "observations": "123",
         "action": None
     }
     response = self.client.post(url, data, format='json')
     self.assertEqual(response.status_code, status.HTTP_201_CREATED)
     self.assertEqual(Measurement.objects.count(), 1)
    def test_creation_of_measurement(self):
        """
        Create a measurement with all fields specified
        """
        template = TemplateFactory()
        attribute = AttributeFactory(template=template)
        rating = RatingFactory(attribute=attribute)
        target_rating = RatingFactory(attribute=attribute)
        assessment = AssessmentFactory(template=template)
        measurement = MeasurementFactory(assessment=assessment,
                                         attribute=attribute,
                                         rating=rating,
                                         target_rating=target_rating)
        measurement.clean()

        self.assertEqual(1, Measurement.objects.count())
        self.assertEqual(
            "%s - %s - %s" % (str(assessment), attribute.name, rating.name),
            str(measurement))
 def test_create_measurement_no_rating(self):
     """
     Ensure we can't create a new measurement object without a rating.
     """
     assessment = AssessmentFactory()
     target_rating = RatingFactory()
     url = reverse('measurement-list')
     data = {
         "id": None,
         "assessment": assessment.id,
         "attribute": target_rating.attribute.id,
         "rating": None,
         "target_rating": target_rating.id,
         "observations": "123",
         "action": "456"
     }
     response = self.client.post(url, data, format='json')
     self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
     self.assertEqual(Measurement.objects.count(), 0)
    def test_cannot_update_measurement_when_assessment_is_read_only(self):
        """
        Ensure we cannot update an existing measurement object when assessment is read only
        """
        assessment = AssessmentFactory(status="DONE")
        rating = RatingFactory()
        target_rating = RatingFactory(attribute=rating.attribute)
        measurement = MeasurementFactory(assessment=assessment,
                                         attribute=rating.attribute,
                                         rating=rating)

        url = reverse('measurement-detail', args=(measurement.id, ))
        data = {
            "id": measurement.id,
            "assessment": assessment.id,
            "attribute": rating.attribute.id,
            "rating": rating.id,
            "target_rating": target_rating.id,
            "observations": "123",
            "action": "456"
        }
        response = self.client.put(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
    def test_fail_measurement_with_rating_from_different_template(self):
        """
        Don't create measurements referring to rating from a different template than the assessment
        """
        template1 = TemplateFactory()
        attribute1 = AttributeFactory(template=template1)
        rating1 = RatingFactory(attribute=attribute1)

        assessment = AssessmentFactory(template=template1)

        template2 = TemplateFactory()
        attribute2 = AttributeFactory(template=template2)
        rating2 = RatingFactory(attribute=attribute2)

        measurement1 = MeasurementFactory(assessment=assessment,
                                          attribute=attribute1,
                                          rating=rating2)
        self.assertRaises(ValidationError, measurement1.clean)

        measurement2 = MeasurementFactory(assessment=assessment,
                                          attribute=attribute2,
                                          rating=rating1,
                                          target_rating=rating2)
        self.assertRaises(ValidationError, measurement2.clean)
 def test_ordering_of_assessments(self):
     assessment1 = AssessmentFactory()
     assessment2 = AssessmentFactory()
     self.assertEqual(assessment2, Assessment.objects.first())