def test_duplicate_additional_item_slug(self):
        """Verify protection against duplicate additional-item slugs.

        Model should throw an IntegrityError when saving multiple
        additional items with the same slug key to a package.
        """
        slug_key = 'my-test-content'
        package = package_factory(slug_key='test-item-dais')
        item_factory(
            additional_for=package,
            slug_key=slug_key
        )
        self.assertEqual(package.additional_content.count(), 1)
        self.assertEqual(
            package.additional_content.all()[0].slug_key,
            slug_key
        )
        with self.assertRaises(ValidationError):
            next_item = Item(
                slug_key=slug_key,
                type='text',
                editors=[{'email': '*****@*****.**'}],
                authors=[{'email': '*****@*****.**'}],
                budget_line='Budget line',
                primary_for_package=None,
                additional_for_package=package
            )
            next_item.validate_unique()
    def test_searches_slug_keys(self):
        """Verify search query behavior.

        Searches should find packages based on both primary & additional
        content slug keys.
        """
        package = package_factory(slug_key='test-pkg-api-ssk')
        item_factory(primary_for=package)
        item_factory(additional_for=package, slug_key='klmnopqrst')

        response = self.client.get(PACKAGES_API_ENDPOINT, data={
            'format': 'json',
            'search': 'test-pkg-api-ssk'
        })
        json_response = json.loads(response.content)
        self.assertEqual(json_response['count'], 1)
        self.assertEqual(json_response['results'][0]['id'], package.pk)

        response = self.client.get(PACKAGES_API_ENDPOINT, data={
            'format': 'json',
            'search': 'klmnopqrst'
        })
        json_response = json.loads(response.content)
        self.assertEqual(json_response['count'], 1)
        self.assertEqual(json_response['results'][0]['id'], package.pk)
    def test_change_created_on_addl_item_update(self):
        """Verify creation of Change instance on additional item update.

        When an additional content item is updated via the API, a change
        model should be created to reflect this modification.
        """
        package = package_factory(slug_key='test-audit-ccoaiu')
        item_factory(primary_for=package)
        additional_item = item_factory(additional_for=package)

        response = self.client.patch(
            '%s%s/?format=json' % (ITEMS_API_ENDPOINT, additional_item.pk,),
            json.dumps({
                'budgetLine': 'Updated budget line',
            }),
            content_type='application/json'
        )
        self.assertEqual(response.status_code, 200)

        change = Change.objects.get(
            item_id=additional_item.pk,
            item_content_type='item'
        )
        self.assertEqual(change.package, package)
        self.assertEqual(change.by, self.creator.pk)
 def test_author_filter(self):
     """Author field should return items based on author's e-mail."""
     item_factory(
         author='*****@*****.**',
         primary_for=package_factory(slug_key='test-items-api-p3')
     )
     response = self.client.get(ITEMS_API_ENDPOINT, data={
         'format': 'json',
         'author': '*****@*****.**'
     })
     self.assertEqual(response.status_code, 200)
     self.assertEqual(json.loads(response.content)['count'], 1)
 def setUpTestData(cls):
     # Generate packages on 5 consecutive days, so we can run date-bound
     # filtered queries
     for offset in range(5):
         days_to_add = offset + 1
         lower = tz.localize(datetime(2015, 5, 1)) + timedelta(
             days=days_to_add
         )
         upper = lower + timedelta(days=1)
         package = package_factory(
             publish_date_lower=lower,
             publish_date_upper=upper)
         item_factory(primary_for=package)
 def test_person_filter(self):
     """Person filter should search both author & editor fields."""
     item_factory(
         author='*****@*****.**',
         primary_for=package_factory(slug_key='test-items-api-p1')
     )
     item_factory(
         editor='*****@*****.**',
         primary_for=package_factory(slug_key='test-items-api-p2')
     )
     response = self.client.get(ITEMS_API_ENDPOINT, data={
         'format': 'json',
         'person': '*****@*****.**'
     })
     self.assertEqual(response.status_code, 200)
     self.assertEqual(json.loads(response.content)['count'], 2)
    def test_person_filter_on_primary_editor(self):
        """Verify person filter behavior.

        Such filtering should return packages whose primary
        content has an 'editor' whose email matches the search term.
        """
        package_with_primary = package_factory(slug_key='test-pkg-api-pfope')
        item_factory(primary_for=package_with_primary, editor='*****@*****.**')

        response = self.client.get(PACKAGES_API_ENDPOINT, data={
            'format': 'json',
            'person': '*****@*****.**'
        })
        json_response = json.loads(response.content)
        self.assertEqual(json_response['count'], 1)
        self.assertEqual(json_response['results'][0]['id'],
                         package_with_primary.pk)
    def test_date_filter(self):
        """Verify publish_date filter behavior.

        Publish date filter should return items based on primary and
        additional package's publish date.
        """
        package = package_factory(
            publish_date_lower=make_aware(datetime(2015, 7, 4)),
            publish_date_upper=make_aware(datetime(2015, 7, 5)),
            slug_key='test-items-api-d1'
        )
        item_factory(primary_for=package)
        item_factory(additional_for=package)
        response = self.client.get(ITEMS_API_ENDPOINT, data={
            'format': 'json',
            'publish_date': '2015-07-04,2015-07-05'
        })
        self.assertEqual(response.status_code, 200)
        self.assertEqual(json.loads(response.content)['count'], 2)
 def setUpTestData(cls):
     cls.item = item_factory(
         primary_for=package_factory(slug_key='test-change')
     )
     cls.user = User.objects.create_user('user')
     cls.change = Change.objects.create(
         by=cls.user.pk,
         package=cls.item.primary_for_package,
         item_content_type='item',
         item_id=cls.item.pk
     )
 def setUpTestData(cls):
     package_one = package_factory(slug_key='test-items-api-base')
     item_factory(primary_for=package_one)
     item_factory(additional_for=package_one, slug_key='addl1')
     # item_factory(additional_for=package_one)
     for _ in range(5):
         slug_key = 'test-items-api-{}'.format(_)
         item_factory(primary_for=package_factory(slug_key=slug_key))
    def test_additional_item_slug(self):
        """Verify additional-item slug behavior.

        An additional item's slug should be the concatenation of its
        parent package's slug and the individual item's slug key.
        """
        slug_key = 'my-test-content'
        package = package_factory(slug_key='test-item-ais')
        additional_item = item_factory(
            additional_for=package,
            slug_key=slug_key
        )
        self.assertEqual(
            additional_item.full_slug,
            '{}.{}'.format(package.full_slug, slug_key)
        )
    def setUpTestData(cls):
        cls.user = User.objects.create_user('user')
        package = package_factory(slug_key='test-cqs')
        item = item_factory(primary_for=package)

        for _ in range(0, 5):
            Change.objects.create(
                by=cls.user.pk,
                package=package,
                item_content_type='package',
                item_id=package.pk
            )
            Change.objects.create(
                by=cls.user.pk,
                package=package,
                item_content_type='item',
                item_id=item.pk
            )
 def test_primary_item_slug(self):
     """Primary item's slug should be None."""
     package = package_factory(slug_key='test-item-pis')
     primary_item = item_factory(primary_for=package)
     self.assertIsNone(primary_item.full_slug)
 def setUpTestData(cls):
     for _ in range(5):
         package_slug = 'test-package-{}'.format(_)
         item_factory(primary_for=package_factory(slug_key=package_slug))