Exemple #1
0
    def test_my_org_discussions_with_search(self):
        user = self.login()
        member = Member(user=user, role='editor')
        organization = OrganizationFactory(members=[member])
        reuse = ReuseFactory(owner=user)
        org_reuse = ReuseFactory(organization=organization)
        dataset = VisibleDatasetFactory(owner=user)
        org_dataset = VisibleDatasetFactory(organization=organization)

        discussions = [
            Discussion.objects.create(subject=dataset, title='foô', user=user),
            Discussion.objects.create(subject=org_reuse,
                                      title='foô',
                                      user=user),
        ]

        # Should not be listed.
        Discussion.objects.create(subject=reuse, title='', user=user),
        Discussion.objects.create(subject=org_dataset, title='', user=user),

        # Should really not be listed.
        Discussion.objects.create(subject=VisibleDatasetFactory(),
                                  title='foô',
                                  user=user)
        Discussion.objects.create(subject=ReuseFactory(),
                                  title='foô',
                                  user=user)

        response = self.get(url_for('api.my_org_discussions'), qs={'q': 'foô'})
        self.assert200(response)
        self.assertEqual(len(response.json), len(discussions))
Exemple #2
0
    def test_reuses_csv(self):
        with self.autoindex():
            reuses = [
                ReuseFactory(datasets=[DatasetFactory()]) for _ in range(5)
            ]
            hidden_reuse = ReuseFactory()

        response = self.get(url_for('site.reuses_csv'))

        self.assert200(response)
        self.assertEqual(response.mimetype, 'text/csv')
        self.assertEqual(response.charset, 'utf-8')

        csvfile = StringIO(response.data.decode('utf8'))
        reader = csv.get_reader(csvfile)
        header = next(reader)

        self.assertEqual(header[0], 'id')
        self.assertIn('title', header)
        self.assertIn('description', header)
        self.assertIn('created_at', header)
        self.assertIn('last_modified', header)
        self.assertIn('tags', header)
        self.assertIn('metric.datasets', header)

        rows = list(reader)
        ids = [row[0] for row in rows]

        self.assertEqual(len(rows), len(reuses))
        for reuse in reuses:
            self.assertIn(str(reuse.id), ids)
        self.assertNotIn(str(hidden_reuse.id), ids)
Exemple #3
0
    def test_suggest_reuses_api(self, api):
        '''It should suggest reuses'''
        for i in range(3):
            ReuseFactory(title='test-{0}'.format(i) if i % 2 else faker.word(),
                         visible=True,
                         metrics={"followers": i})
        max_follower_reuse = ReuseFactory(title='test-4',
                                          visible=True,
                                          metrics={"followers": 10})

        response = api.get(url_for('api.suggest_reuses'),
                           qs={
                               'q': 'tes',
                               'size': '5'
                           })
        assert200(response)

        assert len(response.json) <= 5
        assert len(response.json) > 1

        for suggestion in response.json:
            assert 'id' in suggestion
            assert 'slug' in suggestion
            assert 'title' in suggestion
            assert 'image_url' in suggestion
            assert 'test' in suggestion['title']
        assert response.json[0]['id'] == str(max_follower_reuse.id)
Exemple #4
0
    def setup(self, api, clean_db):
        # Register at least two badges
        Reuse.__badges__['test-1'] = 'Test 1'
        Reuse.__badges__['test-2'] = 'Test 2'

        self.factory = badge_factory(Reuse)
        self.user = api.login(AdminFactory())
        self.reuse = ReuseFactory()
Exemple #5
0
    def test_owned_by_user(self):
        user = UserFactory()
        reuse = ReuseFactory(owner=user)
        ReuseFactory(owner=UserFactory())

        result = Reuse.objects.owned_by(user)

        self.assertEqual(len(result), 1)
        self.assertEqual(result[0], reuse)
Exemple #6
0
    def test_owned_by_org(self):
        org = OrganizationFactory()
        reuse = ReuseFactory(organization=org)
        ReuseFactory(organization=OrganizationFactory())

        result = Reuse.objects.owned_by(org)

        self.assertEqual(len(result), 1)
        self.assertEqual(result[0], reuse)
Exemple #7
0
    def test_reuse_api_feature_already(self):
        '''It shouldn't do anything to feature an already featured reuse'''
        reuse = ReuseFactory(featured=True)

        with self.api_user(AdminFactory()):
            response = self.post(url_for('api.reuse_featured', reuse=reuse))
        self.assert200(response)

        reuse.reload()
        self.assertTrue(reuse.featured)
Exemple #8
0
    def test_reuse_api_unfeature(self):
        '''It should mark the reuse featured on POST'''
        reuse = ReuseFactory(featured=True)

        with self.api_user(AdminFactory()):
            response = self.delete(url_for('api.reuse_featured', reuse=reuse))
        self.assert200(response)

        reuse.reload()
        self.assertFalse(reuse.featured)
Exemple #9
0
 def test_reuse_api_update(self, api):
     '''It should update a reuse from the API'''
     user = api.login()
     reuse = ReuseFactory(owner=user)
     data = reuse.to_dict()
     data['description'] = 'new description'
     response = api.put(url_for('api.reuse', reuse=reuse), data)
     assert200(response)
     assert Reuse.objects.count() == 1
     assert Reuse.objects.first().description == 'new description'
Exemple #10
0
 def test_reuse_api_update(self):
     '''It should update a reuse from the API'''
     self.login()
     reuse = ReuseFactory(owner=self.user)
     data = reuse.to_dict()
     data['description'] = 'new description'
     response = self.put(url_for('api.reuse', reuse=reuse), data)
     self.assert200(response)
     self.assertEqual(Reuse.objects.count(), 1)
     self.assertEqual(Reuse.objects.first().description, 'new description')
Exemple #11
0
    def test_reuse_api_unfeature(self):
        '''It should mark the reuse featured on POST'''
        reuse = ReuseFactory(featured=True)

        with self.api_user(AdminFactory()):
            response = self.delete(url_for('api.reuse_featured', reuse=reuse))
        self.assert200(response)

        reuse.reload()
        self.assertFalse(reuse.featured)
Exemple #12
0
    def test_reuse_api_unfeature_already(self):
        '''It shouldn't do anything to unfeature a not featured reuse'''
        reuse = ReuseFactory(featured=False)

        with self.api_user(AdminFactory()):
            response = self.delete(url_for('api.reuse_featured', reuse=reuse))
        self.assert200(response)

        reuse.reload()
        self.assertFalse(reuse.featured)
Exemple #13
0
    def test_reuse_api_feature_already(self):
        '''It shouldn't do anything to feature an already featured reuse'''
        reuse = ReuseFactory(featured=True)

        with self.api_user(AdminFactory()):
            response = self.post(url_for('api.reuse_featured', reuse=reuse))
        self.assert200(response)

        reuse.reload()
        self.assertTrue(reuse.featured)
Exemple #14
0
    def test_reuse_api_unfeature(self, api):
        '''It should mark the reuse featured on POST'''
        reuse = ReuseFactory(featured=True)

        with api.user(AdminFactory()):
            response = api.delete(url_for('api.reuse_featured', reuse=reuse))
        assert200(response)

        reuse.reload()
        assert not reuse.featured
Exemple #15
0
 def test_reuse_api_update(self):
     '''It should update a reuse from the API'''
     self.login()
     reuse = ReuseFactory(owner=self.user)
     data = reuse.to_dict()
     data['description'] = 'new description'
     response = self.put(url_for('api.reuse', reuse=reuse), data)
     self.assert200(response)
     self.assertEqual(Reuse.objects.count(), 1)
     self.assertEqual(Reuse.objects.first().description, 'new description')
    def test_list_org_reuses_hide_private(self, api):
        '''Should not include private reuses when not member'''
        org = OrganizationFactory()
        reuses = ReuseFactory.create_batch(3, organization=org)
        ReuseFactory.create_batch(2, organization=org, private=True)

        response = api.get(url_for('api.org_reuses', org=org))

        assert200(response)
        assert len(response.json) == len(reuses)
Exemple #17
0
    def test_reuse_api_unfeature_already(self):
        '''It shouldn't do anything to unfeature a not featured reuse'''
        reuse = ReuseFactory(featured=False)

        with self.api_user(AdminFactory()):
            response = self.delete(url_for('api.reuse_featured', reuse=reuse))
        self.assert200(response)

        reuse.reload()
        self.assertFalse(reuse.featured)
Exemple #18
0
    def test_suggest_reuses_api_no_match(self, api):
        '''It should not provide reuse suggestion if no match'''
        ReuseFactory.create_batch(3, visible=True)

        response = api.get(url_for('api.suggest_reuses'),
                           qs={
                               'q': 'xxxxxx',
                               'size': '5'
                           })
        assert200(response)
        assert len(response.json) == 0
 def test_render_profile_reuses(self):
     '''It should render the user profile reuses page'''
     user = UserFactory()
     reuses = [ReuseFactory(owner=user, datasets=[DatasetFactory()])
               for _ in range(3)]
     for _ in range(2):
         ReuseFactory(datasets=[DatasetFactory()])
     response = self.get(url_for('users.reuses', user=user))
     self.assert200(response)
     rendered_reuses = self.get_context_variable('reuses')
     self.assertEqual(len(rendered_reuses), len(reuses))
Exemple #20
0
    def test_my_org_reuses(self):
        user = self.login()
        member = Member(user=user, role='editor')
        organization = OrganizationFactory(members=[member])
        reuses = [ReuseFactory(owner=user) for _ in range(2)]
        org_reuses = [ReuseFactory(organization=organization)
                      for _ in range(2)]

        response = self.get(url_for('api.my_org_reuses'))
        self.assert200(response)
        self.assertEqual(len(response.json), len(reuses) + len(org_reuses))
Exemple #21
0
    def test_reuse_api_add_dataset_not_found(self):
        '''It should return 404 when adding an unknown dataset to a reuse'''
        self.login()
        reuse = ReuseFactory(owner=self.user)

        data = {'id': 'not-found', 'class': 'Dataset'}
        url = url_for('api.reuse_add_dataset', reuse=reuse)
        response = self.post(url, data)

        self.assert404(response)
        reuse.reload()
        self.assertEqual(len(reuse.datasets), 0)
Exemple #22
0
    def test_reuse_api_add_dataset_not_found(self):
        '''It should return 404 when adding an unknown dataset to a reuse'''
        self.login()
        reuse = ReuseFactory(owner=self.user)

        data = {'id': 'not-found', 'class': 'Dataset'}
        url = url_for('api.reuse_add_dataset', reuse=reuse)
        response = self.post(url, data)

        self.assert404(response)
        reuse.reload()
        self.assertEqual(len(reuse.datasets), 0)
Exemple #23
0
    def test_reuse_api_add_dataset_twice(self):
        '''It should not add twice a dataset to a reuse from the API'''
        self.login()
        dataset = DatasetFactory()
        reuse = ReuseFactory(owner=self.user, datasets=[dataset])

        data = {'id': dataset.id, 'class': 'Dataset'}
        url = url_for('api.reuse_add_dataset', reuse=reuse)
        response = self.post(url, data)
        self.assert200(response)
        reuse.reload()
        self.assertEqual(len(reuse.datasets), 1)
        self.assertEqual(reuse.datasets[-1], dataset)
Exemple #24
0
    def test_reuse_api_add_dataset_twice(self, api):
        '''It should not add twice a dataset to a reuse from the API'''
        user = api.login()
        dataset = DatasetFactory()
        reuse = ReuseFactory(owner=user, datasets=[dataset])

        data = {'id': dataset.id, 'class': 'Dataset'}
        url = url_for('api.reuse_add_dataset', reuse=reuse)
        response = api.post(url, data)
        assert200(response)
        reuse.reload()
        assert len(reuse.datasets) == 1
        assert reuse.datasets[-1] == dataset
Exemple #25
0
    def test_reuse_api_add_dataset_twice(self):
        '''It should not add twice a dataset to a reuse from the API'''
        self.login()
        dataset = DatasetFactory()
        reuse = ReuseFactory(owner=self.user, datasets=[dataset])

        data = {'id': dataset.id, 'class': 'Dataset'}
        url = url_for('api.reuse_add_dataset', reuse=reuse)
        response = self.post(url, data)
        self.assert200(response)
        reuse.reload()
        self.assertEqual(len(reuse.datasets), 1)
        self.assertEqual(reuse.datasets[-1], dataset)
Exemple #26
0
    def test_render_home(self):
        '''It should render the home page'''
        for i in range(3):
            org = OrganizationFactory()
            DatasetFactory(organization=org)
            ReuseFactory(organization=org)

        current_site.settings.home_datasets = [
            DatasetFactory() for _ in range(3)
        ]
        current_site.settings.home_reuses = [ReuseFactory() for _ in range(3)]

        response = self.get(url_for('site.home'))
        self.assert200(response)
Exemple #27
0
    def test_owned_by_org_or_user(self):
        user = UserFactory()
        org = OrganizationFactory()
        reuses = [ReuseFactory(owner=user), ReuseFactory(organization=org)]
        excluded = [ReuseFactory(owner=UserFactory()),
                    ReuseFactory(organization=OrganizationFactory())]

        result = Reuse.objects.owned_by(org, user)

        self.assertEqual(len(result), 2)
        for reuse in result:
            self.assertIn(reuse, reuses)

        for reuse in excluded:
            self.assertNotIn(reuse, result)
Exemple #28
0
def generate_fixtures(datasets, reuses):
    '''Build sample fixture data (users, datasets and reuses).'''
    user = UserFactory()
    log.info('Generated user "{user.email}".'.format(user=user))

    organization = OrganizationFactory(members=[Member(user=user)])
    log.info('Generated organization "{org.name}".'.format(org=organization))

    for _ in range(datasets):
        dataset = VisibleDatasetFactory(organization=organization)
        DiscussionFactory(subject=dataset, user=user)
        ReuseFactory.create_batch(reuses, datasets=[dataset], owner=user)

    msg = 'Generated {datasets} dataset(s) with {reuses} reuse(s) each.'
    log.info(msg.format(**locals()))
Exemple #29
0
    def test_purge_reuses(self):
        reuse = ReuseFactory(title='test-reuse')

        # Upload reuse's image
        file = create_test_image()
        user = AdminFactory()
        self.login(user)
        response = self.post(url_for('api.reuse_image', reuse=reuse),
                             {'file': (file, 'test.png')},
                             json=False)
        self.assert200(response)

        # Delete reuse
        response = self.delete(url_for('api.reuse', reuse=reuse))
        self.assert204(response)

        user = UserFactory()
        transfer = Transfer.objects.create(
            owner=user,
            recipient=user,
            subject=reuse,
            comment='comment',
        )

        tasks.purge_reuses()

        assert Transfer.objects.filter(id=transfer.id).count() == 0

        # Check reuse's image is deleted
        self.assertEqual(list(storages.images.list_files()), [])

        deleted_reuse = Reuse.objects(title='test-reuse').first()
        self.assertIsNone(deleted_reuse)
Exemple #30
0
    def test_issues_for_user_with_closed(self):
        owner = UserFactory()
        dataset = DatasetFactory(owner=owner)
        reuse = ReuseFactory(owner=owner)

        open_issues = []
        for i in range(3):
            user = UserFactory()
            message = Message(content=faker.sentence(), posted_by=user)
            open_issues.append(
                Issue.objects.create(subject=dataset,
                                     user=user,
                                     title=faker.sentence(),
                                     discussion=[message]))
            open_issues.append(
                Issue.objects.create(subject=reuse,
                                     user=user,
                                     title=faker.sentence(),
                                     discussion=[message]))

        # Creating a closed issue that shouldn't show up in response.
        user = UserFactory()
        message = Message(content=faker.sentence(), posted_by=user)
        Issue.objects.create(subject=dataset,
                             user=user,
                             title=faker.sentence(),
                             discussion=[message],
                             closed=datetime.now(),
                             closed_by=user)

        issues = issues_for(owner, only_open=False)

        self.assertEqual(len(issues), len(open_issues) + 1)
Exemple #31
0
    def test_reuse_api_list(self, api):
        '''It should fetch a reuse list from the API'''
        reuses = ReuseFactory.create_batch(3, visible=True)

        response = api.get(url_for('api.reuses'))
        assert200(response)
        assert len(response.json['data']) == len(reuses)
Exemple #32
0
    def test_suggest_tags_api_with_unicode(self, api, autoindex):
        '''It should suggest tags'''
        with autoindex:
            for i in range(3):
                tags = [
                    faker.word(),
                    faker.word(), 'testé', 'testé-{0}'.format(i)
                ]
                ReuseFactory(tags=tags, visible=True)
                DatasetFactory(tags=tags, visible=True)

        response = api.get(url_for('api.suggest_tags'),
                           qs={
                               'q': 'testé',
                               'size': '5'
                           })
        assert200(response)

        assert len(response.json) <= 5
        assert len(response.json) > 1
        assert response.json[0]['text'] == 'teste'

        for suggestion in response.json:
            assert 'text' in suggestion
            assert 'score' in suggestion
            assert suggestion['text'].startswith('teste')
Exemple #33
0
    def test_suggest_tags_api_with_unicode(self):
        '''It should suggest tags'''
        with self.autoindex():
            for i in range(3):
                tags = [
                    faker.word(),
                    faker.word(), 'testé', 'testé-{0}'.format(i)
                ]
                ReuseFactory(tags=tags, visible=True)
                DatasetFactory(tags=tags, visible=True)

        response = self.get(url_for('api.suggest_tags'),
                            qs={
                                'q': 'testé',
                                'size': '5'
                            })
        self.assert200(response)

        self.assertLessEqual(len(response.json), 5)
        self.assertGreater(len(response.json), 1)
        self.assertEqual(response.json[0]['text'], 'teste')

        for suggestion in response.json:
            self.assertIn('text', suggestion)
            self.assertIn('score', suggestion)
            self.assertTrue(suggestion['text'].startswith('teste'))
    def test_render_display_with_private_reuses(self):
        '''It should render the organization page with some private reuses'''
        me = self.login()
        member = Member(user=me, role='editor')
        organization = OrganizationFactory(members=[member])
        reuses = [
            VisibleReuseFactory(organization=organization) for _ in range(2)
        ]
        empty_reuses = [
            ReuseFactory(organization=organization, datasets=[])
            for _ in range(2)
        ]
        private_reuses = [
            VisibleReuseFactory(organization=organization, private=True)
            for _ in range(2)
        ]
        response = self.get(url_for('organizations.show', org=organization))

        self.assert200(response)
        rendered_reuses = self.get_context_variable('reuses')
        self.assertEqual(len(rendered_reuses),
                         len(reuses) + len(private_reuses) + len(empty_reuses))

        rendered_private_reuses = [
            reuse for reuse in rendered_reuses if reuse.private
        ]
        self.assertEqual(len(rendered_private_reuses), len(private_reuses))

        total_reuses = self.get_context_variable('total_reuses')
        self.assertEqual(total_reuses,
                         len(reuses) + len(private_reuses) + len(empty_reuses))
Exemple #35
0
    def test_suggest_reuses_api_unicode(self, api, autoindex):
        '''It should suggest reuses with special characters'''
        with autoindex:
            for i in range(4):
                ReuseFactory(title='testé-{0}'.format(i) if i %
                             2 else faker.word(),
                             visible=True)

        response = api.get(url_for('api.suggest_reuses'),
                           qs={
                               'q': 'testé',
                               'size': '5'
                           })
        assert200(response)

        assert len(response.json) <= 5
        assert len(response.json) > 1

        for suggestion in response.json:
            assert 'id' in suggestion
            assert 'slug' in suggestion
            assert 'title' in suggestion
            assert 'score' in suggestion
            assert 'image_url' in suggestion
            assert suggestion['title'].startswith('test')
Exemple #36
0
    def test_suggest_reuses_api_unicode(self):
        '''It should suggest reuses with special characters'''
        with self.autoindex():
            for i in range(4):
                ReuseFactory(title='testé-{0}'.format(i) if i %
                             2 else faker.word(),
                             datasets=[DatasetFactory()])

        response = self.get(url_for('api.suggest_reuses'),
                            qs={
                                'q': 'testé',
                                'size': '5'
                            })
        self.assert200(response)

        self.assertLessEqual(len(response.json), 5)
        self.assertGreater(len(response.json), 1)

        for suggestion in response.json:
            self.assertIn('id', suggestion)
            self.assertIn('slug', suggestion)
            self.assertIn('title', suggestion)
            self.assertIn('score', suggestion)
            self.assertIn('image_url', suggestion)
            self.assertTrue(suggestion['title'].startswith('test'))
Exemple #37
0
    def test_reuse_api_create(self):
        '''It should create a reuse from the API'''
        data = ReuseFactory.as_dict()
        self.login()
        response = self.post(url_for('api.reuses'), data)
        self.assert201(response)
        self.assertEqual(Reuse.objects.count(), 1)

        reuse = Reuse.objects.first()
        self.assertEqual(reuse.owner, self.user)
        self.assertIsNone(reuse.organization)
Exemple #38
0
    def test_reuse_api_create_as_permissions(self):
        """It should create a reuse as organization from the API

        only if user is member.
        """
        self.login()
        data = ReuseFactory.as_dict()
        org = OrganizationFactory()
        data['organization'] = str(org.id)
        response = self.post(url_for('api.reuses'), data)
        self.assert400(response)
        self.assertEqual(Reuse.objects.count(), 0)
Exemple #39
0
    def test_delete_home_reuse(self):
        '''Should pull home reuses on deletion'''
        current_site.settings.home_reuses = ReuseFactory.create_batch(3)
        current_site.save()

        reuse = current_site.settings.home_reuses[1]
        reuse.deleted = datetime.now()
        reuse.save()

        current_site.reload()
        home_reuses = [r.id for r in current_site.settings.home_reuses]
        self.assertEqual(len(home_reuses), 2)
        self.assertNotIn(reuse.id, home_reuses)
Exemple #40
0
    def test_reuse_api_create_as_org(self):
        '''It should create a reuse as organization from the API'''
        self.login()
        data = ReuseFactory.as_dict()
        member = Member(user=self.user, role='editor')
        org = OrganizationFactory(members=[member])
        data['organization'] = str(org.id)
        response = self.post(url_for('api.reuses'), data)
        self.assert201(response)
        self.assertEqual(Reuse.objects.count(), 1)

        reuse = Reuse.objects.first()
        self.assertIsNone(reuse.owner)
        self.assertEqual(reuse.organization, org)
Exemple #41
0
 def reuses(self):
     return ReuseFactory.create_batch(3)
Exemple #42
0
 def setUp(self):
     self.login(AdminFactory())
     self.reuse = ReuseFactory()
Exemple #43
0
 def test_send_on_delete(self):
     reuse = ReuseFactory()
     with assert_emit(Reuse.on_delete):
         reuse.deleted = datetime.now()
         reuse.save()
Exemple #44
0
class ReuseBadgeAPITest(APITestCase):
    @classmethod
    def setUpClass(cls):
        # Register at least two badges
        Reuse.__badges__['test-1'] = 'Test 1'
        Reuse.__badges__['test-2'] = 'Test 2'

        cls.factory = badge_factory(Reuse)

    def setUp(self):
        self.login(AdminFactory())
        self.reuse = ReuseFactory()

    def test_list(self):
        response = self.get(url_for('api.available_reuse_badges'))
        self.assertStatus(response, 200)
        self.assertEqual(len(response.json), len(Reuse.__badges__))
        for kind, label in Reuse.__badges__.items():
            self.assertIn(kind, response.json)
            self.assertEqual(response.json[kind], label)

    def test_create(self):
        data = self.factory.as_dict()
        with self.api_user():
            response = self.post(
                url_for('api.reuse_badges', reuse=self.reuse), data)
        self.assert201(response)
        self.reuse.reload()
        self.assertEqual(len(self.reuse.badges), 1)

    def test_create_same(self):
        data = self.factory.as_dict()
        with self.api_user():
            self.post(
                url_for('api.reuse_badges', reuse=self.reuse), data)
            response = self.post(
                url_for('api.reuse_badges', reuse=self.reuse), data)
        self.assertStatus(response, 200)
        self.reuse.reload()
        self.assertEqual(len(self.reuse.badges), 1)

    def test_create_2nd(self):
        # Explicitely setting the kind to avoid collisions given the
        # small number of choices for kinds.
        kinds_keys = Reuse.__badges__.keys()
        self.reuse.add_badge(kinds_keys[0])
        data = self.factory.as_dict()
        data['kind'] = kinds_keys[1]
        with self.api_user():
            response = self.post(
                url_for('api.reuse_badges', reuse=self.reuse), data)
        self.assert201(response)
        self.reuse.reload()
        self.assertEqual(len(self.reuse.badges), 2)

    def test_delete(self):
        badge = self.factory()
        self.reuse.add_badge(badge.kind)
        with self.api_user():
            response = self.delete(
                url_for('api.reuse_badge', reuse=self.reuse,
                        badge_kind=str(badge.kind)))
        self.assertStatus(response, 204)
        self.reuse.reload()
        self.assertEqual(len(self.reuse.badges), 0)

    def test_delete_404(self):
        with self.api_user():
            response = self.delete(
                url_for('api.reuse_badge', reuse=self.reuse,
                        badge_kind=str(self.factory().kind)))
        self.assert404(response)