Ejemplo n.º 1
0
    def test_create_override_for_newer_build(self):
        old_build = RpmBuild.get('bodhi-2.0-1.fc17')

        build = RpmBuild(nvr='bodhi-2.0-2.fc17', package=old_build.package,
                         release=old_build.release)
        self.db.add(build)
        self.db.flush()

        expiration_date = datetime.utcnow() + timedelta(days=1)

        data = {'nvr': build.nvr, 'notes': 'blah blah blah',
                'expiration_date': expiration_date,
                'csrf_token': self.get_csrf_token()}
        expected_messages = (
            override_schemas.BuildrootOverrideUntagV1,
            override_schemas.BuildrootOverrideTagV1)

        with fml_testing.mock_sends(*expected_messages):
            res = self.app.post('/overrides/', data)

        o = res.json_body
        self.assertEqual(o['build_id'], build.id)
        self.assertEqual(o['notes'], 'blah blah blah')
        self.assertEqual(o['expiration_date'],
                         expiration_date.strftime("%Y-%m-%d %H:%M:%S"))
        self.assertEqual(o['expired_date'], None)

        old_build = RpmBuild.get('bodhi-2.0-1.fc17')

        self.assertNotEqual(old_build.override['expired_date'], None)
Ejemplo n.º 2
0
    def test_create_override_for_newer_build(self, publish):
        old_build = RpmBuild.get('bodhi-2.0-1.fc17')

        build = RpmBuild(nvr='bodhi-2.0-2.fc17', package=old_build.package,
                         release=old_build.release)
        self.db.add(build)
        self.db.flush()

        expiration_date = datetime.utcnow() + timedelta(days=1)

        data = {'nvr': build.nvr, 'notes': 'blah blah blah',
                'expiration_date': expiration_date,
                'csrf_token': self.get_csrf_token()}
        res = self.app.post('/overrides/', data)

        publish.assert_any_call(topic='buildroot_override.tag', msg=mock.ANY)
        publish.assert_any_call(
            topic='buildroot_override.untag', msg=mock.ANY)

        o = res.json_body
        self.assertEqual(o['build_id'], build.id)
        self.assertEqual(o['notes'], 'blah blah blah')
        self.assertEqual(o['expiration_date'],
                         expiration_date.strftime("%Y-%m-%d %H:%M:%S"))
        self.assertEqual(o['expired_date'], None)

        old_build = RpmBuild.get('bodhi-2.0-1.fc17')

        self.assertNotEqual(old_build.override['expired_date'], None)
Ejemplo n.º 3
0
    def setUp(self, *args, **kwargs):
        super(TestCommentsService, self).setUp(*args, **kwargs)

        # Add a second update owned by somebody else so we can test karma
        # policy stuff
        user2 = User(name='lmacken')
        self.db.flush()
        self.db.add(user2)
        release = self.db.query(Release).filter_by(name='F17').one()
        update = Update(
            user=user2,
            request=UpdateRequest.testing,
            type=UpdateType.enhancement,
            notes='Useful details!',
            release=release,
            date_submitted=datetime(1984, 11, 2),
            requirements='rpmlint',
            stable_karma=3,
            unstable_karma=-3,
        )
        self.db.add(update)
        build = RpmBuild(nvr=up2, update=update,
                         package=RpmPackage.query.filter_by(name='bodhi').one())
        self.db.add(build)
        self.db.flush()
Ejemplo n.º 4
0
    def test_unexpire_override(self, publish):
        # First expire a buildroot override
        old_nvr = 'bodhi-2.0-1.fc17'
        override = RpmBuild.get(old_nvr).override
        override.expire()
        self.db.add(override)
        self.db.flush()

        publish.assert_called_once_with(
            topic='buildroot_override.untag', msg=mock.ANY)
        publish.reset_mock()

        # And now push its expiration_date into the future
        res = self.app.get('/overrides/%s' % old_nvr,
                           headers={'Accept': 'application/json'})
        o = res.json_body['override']

        expiration_date = datetime.now() + timedelta(days=1)
        expiration_date = expiration_date.strftime("%Y-%m-%d %H:%M:%S")

        o.update({'nvr': o['build']['nvr'],
                  'edited': old_nvr, 'expiration_date': expiration_date,
                  'csrf_token': self.get_csrf_token()})
        res = self.app.post('/overrides/', o)

        override = res.json_body
        self.assertEqual(override['build'], o['build'])
        self.assertEqual(override['notes'], o['notes'])
        self.assertEqual(override['expiration_date'], o['expiration_date'])
        self.assertEqual(override['expired_date'], None)
        publish.assert_called_once_with(
            topic='buildroot_override.tag', msg=mock.ANY)
Ejemplo n.º 5
0
    def test_create_duplicate_override(self):
        """When creating a duplicate override, old notes are appended."""
        release = Release.get('F17')
        package = RpmPackage(name='not-bodhi')
        self.db.add(package)
        build = RpmBuild(nvr='not-bodhi-2.0-2.fc17', package=package, release=release)
        self.db.add(build)
        self.db.flush()

        expiration_date = datetime.utcnow() + timedelta(days=1)

        data = {'nvr': build.nvr, 'notes': 'blah blah blah',
                'expiration_date': expiration_date,
                'csrf_token': self.get_csrf_token()}

        with fml_testing.mock_sends(override_schemas.BuildrootOverrideTagV1):
            res = self.app.post('/overrides/', data)

        o = res.json_body
        assert o['build_id'] == build.id
        assert o['notes'] == 'blah blah blah'
        assert o['expiration_date'] == expiration_date.strftime("%Y-%m-%d %H:%M:%S")
        assert o['expired_date'] is None

        # Submit it again
        data['notes'] = 'new blah blah'
        res = self.app.post('/overrides/', data)
        o = res.json_body
        new_notes = f"""new blah blah
_____________
_@guest ({datetime.utcnow().strftime('%b %d, %Y')})_
blah blah blah"""
        assert o['notes'] == new_notes
Ejemplo n.º 6
0
    def test_list_overrides_by_multiple_usernames(self):
        release = Release.get('F17')

        package = RpmPackage(name='just-testing')
        self.db.add(package)
        build = RpmBuild(nvr='just-testing-1.0-2.fc17', package=package, release=release)
        self.db.add(build)
        another_user = User(name='aUser')
        self.db.add(another_user)

        expiration_date = datetime.utcnow() + timedelta(days=1)

        override = BuildrootOverride(build=build, submitter=another_user,
                                     notes='Crazy! 😱',
                                     expiration_date=expiration_date)
        self.db.add(override)
        self.db.flush()

        res = self.app.get('/overrides/', {"user": "******"})
        body = res.json_body
        self.assertEqual(len(body['overrides']), 2)

        override_fake = body['overrides'][0]
        self.assertEqual(override_fake['build']['nvr'], 'just-testing-1.0-2.fc17')
        self.assertEqual(override_fake['submitter']['name'], 'aUser')
        self.assertEqual(override_fake['notes'], 'Crazy! 😱')

        override_orig = body['overrides'][1]
        self.assertEqual(override_orig['build']['nvr'], 'bodhi-2.0-1.fc17')
        self.assertEqual(override_orig['submitter']['name'], 'guest')
        self.assertEqual(override_orig['notes'], 'blah blah blah')
Ejemplo n.º 7
0
    def test_create_override_for_build_with_test_gating_status_failed(self):
        """
        Test that Override is not created when the test gating status is failed.
        """
        release = Release.get('F17')
        package = RpmPackage(name='not-bodhi')
        self.db.add(package)
        build = RpmBuild(nvr='not-bodhi-2.0-2.fc17', package=package, release=release)
        update = Update.query.first()
        update.builds.append(build)
        update.test_gating_status = TestGatingStatus.failed
        self.db.add(build)
        self.db.flush()
        expiration_date = datetime.utcnow() + timedelta(days=1)

        data = {'nvr': build.nvr, 'notes': 'blah blah blah',
                'expiration_date': expiration_date,
                'csrf_token': self.get_csrf_token()}

        with fml_testing.mock_sends():
            res = self.app.post('/overrides/', data, status=400)

        errors = res.json_body['errors']
        self.assertEqual(len(errors), 1)
        self.assertEqual(errors[0]['name'], 'nvr')
        self.assertEqual(errors[0]['description'],
                         "Cannot create a buildroot override if "
                         "build's test gating status is failed.")
Ejemplo n.º 8
0
    def test_create_override(self):
        release = Release.get('F17')

        package = RpmPackage(name='not-bodhi')
        self.db.add(package)
        build = RpmBuild(nvr='not-bodhi-2.0-2.fc17',
                         package=package,
                         release=release)
        self.db.add(build)
        self.db.flush()

        expiration_date = datetime.utcnow() + timedelta(days=1)

        data = {
            'nvr': build.nvr,
            'notes': 'blah blah blah',
            'expiration_date': expiration_date,
            'csrf_token': self.get_csrf_token()
        }

        with fml_testing.mock_sends(override_schemas.BuildrootOverrideTagV1):
            res = self.app.post('/overrides/', data)

        o = res.json_body
        assert o['build_id'] == build.id
        assert o['notes'] == 'blah blah blah'
        assert o['expiration_date'] == expiration_date.strftime(
            "%Y-%m-%d %H:%M:%S")
        assert o['expired_date'] is None
Ejemplo n.º 9
0
    def test_cannot_edit_override_build(self):
        release = Release.get('F17')

        old_nvr = 'bodhi-2.0-1.fc17'

        res = self.app.get('/overrides/%s' % old_nvr,
                           headers={'Accept': 'application/json'})
        o = res.json_body['override']
        expiration_date = o['expiration_date']
        old_build_id = o['build_id']

        build = RpmBuild(nvr='bodhi-2.0-2.fc17', release=release,
                         package=RpmPackage.query.filter_by(name='bodhi').one())
        self.db.add(build)
        self.db.flush()

        o.update({
            'nvr': build.nvr,
            'edited': old_nvr,
            'csrf_token': self.get_csrf_token(),
        })

        with fml_testing.mock_sends():
            res = self.app.post('/overrides/', o)

        override = res.json_body
        self.assertEqual(override['build_id'], old_build_id)
        self.assertEqual(override['notes'], 'blah blah blah')
        self.assertEqual(override['expiration_date'], expiration_date)
        self.assertEqual(override['expired_date'], None)
Ejemplo n.º 10
0
    def test_create_override(self, publish):
        release = Release.get('F17')

        package = RpmPackage(name='not-bodhi')
        self.db.add(package)
        build = RpmBuild(nvr='not-bodhi-2.0-2.fc17', package=package, release=release)
        self.db.add(build)
        self.db.flush()

        expiration_date = datetime.utcnow() + timedelta(days=1)

        data = {'nvr': build.nvr, 'notes': 'blah blah blah',
                'expiration_date': expiration_date,
                'csrf_token': self.get_csrf_token()}
        res = self.app.post('/overrides/', data)

        publish.assert_called_once_with(
            topic='buildroot_override.tag', msg=mock.ANY)
        self.assertEqual(len(publish.call_args_list), 1)

        o = res.json_body
        self.assertEqual(o['build_id'], build.id)
        self.assertEqual(o['notes'], 'blah blah blah')
        self.assertEqual(o['expiration_date'],
                         expiration_date.strftime("%Y-%m-%d %H:%M:%S"))
        self.assertEqual(o['expired_date'], None)
Ejemplo n.º 11
0
    def test_create_duplicate_override_notes_too_long(self):
        """When notes are too long, truncate the older."""
        release = Release.get('F17')
        package = RpmPackage(name='not-bodhi')
        self.db.add(package)
        build = RpmBuild(nvr='not-bodhi-2.0-2.fc17', package=package, release=release)
        self.db.add(build)
        self.db.flush()

        expiration_date = datetime.utcnow() + timedelta(days=1)

        data = {'nvr': build.nvr, 'notes': 'blah' * 500,
                'expiration_date': expiration_date,
                'csrf_token': self.get_csrf_token()}

        with fml_testing.mock_sends(override_schemas.BuildrootOverrideTagV1):
            res = self.app.post('/overrides/', data)

        o = res.json_body
        assert o['build_id'] == build.id
        assert o['notes'] == 'blah' * 500
        assert o['expiration_date'] == expiration_date.strftime("%Y-%m-%d %H:%M:%S")
        assert o['expired_date'] is None

        # Submit it again
        data['notes'] = 'new blah blah'
        res = self.app.post('/overrides/', data)
        o = res.json_body
        assert o['notes'].endswith('(...)\n___Notes truncated___')
        assert len(o['notes']) <= 2000
Ejemplo n.º 12
0
    def test_edit_unexisting_override(self):
        release = Release.get(u'F17', self.db)

        build = RpmBuild(
            nvr=u'bodhi-2.0-2.fc17',
            release=release,
            package=RpmPackage.query.filter_by(name='bodhi').one())
        self.db.add(build)
        self.db.flush()

        expiration_date = datetime.utcnow() + timedelta(days=1)

        o = {
            'nvr': build.nvr,
            'notes': 'blah blah blah',
            'expiration_date': expiration_date,
            'edited': build.nvr,
            'csrf_token': self.get_csrf_token(),
        }
        res = self.app.post('/overrides/', o, status=400)

        errors = res.json_body['errors']
        self.assertEquals(len(errors), 1)
        self.assertEquals(errors[0]['name'], 'edited')
        self.assertEquals(errors[0]['description'],
                          'No buildroot override for this build')
Ejemplo n.º 13
0
    def test_cannot_edit_override_build(self, publish):
        release = Release.get(u'F17', self.db)

        old_nvr = u'bodhi-2.0-1.fc17'

        res = self.app.get('/overrides/%s' % old_nvr)
        o = res.json_body['override']
        expiration_date = o['expiration_date']
        old_build_id = o['build_id']

        build = RpmBuild(
            nvr=u'bodhi-2.0-2.fc17',
            release=release,
            package=RpmPackage.query.filter_by(name='bodhi').one())
        self.db.add(build)
        self.db.flush()

        o.update({
            'nvr': build.nvr,
            'edited': old_nvr,
            'csrf_token': self.get_csrf_token(),
        })
        res = self.app.post('/overrides/', o)

        override = res.json_body
        self.assertEquals(override['build_id'], old_build_id)
        self.assertEquals(override['notes'], 'blah blah blah')
        self.assertEquals(override['expiration_date'], expiration_date)
        self.assertEquals(override['expired_date'], None)
        self.assertEquals(len(publish.call_args_list), 0)
Ejemplo n.º 14
0
    def test_unexpire_override(self):
        # First expire a buildroot override
        old_nvr = 'bodhi-2.0-1.fc17'
        override = RpmBuild.get(old_nvr).override

        with fml_testing.mock_sends(override_schemas.BuildrootOverrideUntagV1):
            override.expire()
            self.db.commit()

        self.db.add(override)
        self.db.flush()

        # And now push its expiration_date into the future
        res = self.app.get('/overrides/%s' % old_nvr,
                           headers={'Accept': 'application/json'})
        o = res.json_body['override']

        expiration_date = datetime.now() + timedelta(days=1)
        expiration_date = expiration_date.strftime("%Y-%m-%d %H:%M:%S")

        o.update({'nvr': o['build']['nvr'],
                  'edited': old_nvr, 'expiration_date': expiration_date,
                  'csrf_token': self.get_csrf_token()})

        with fml_testing.mock_sends(override_schemas.BuildrootOverrideTagV1):
            res = self.app.post('/overrides/', o)

        override = res.json_body
        self.assertEqual(override['build'], o['build'])
        self.assertEqual(override['notes'], o['notes'])
        self.assertEqual(override['expiration_date'], o['expiration_date'])
        self.assertEqual(override['expired_date'], None)
Ejemplo n.º 15
0
    def test_create_duplicate_override(self):
        release = Release.get('F17')
        package = RpmPackage(name='not-bodhi')
        self.db.add(package)
        build = RpmBuild(nvr='not-bodhi-2.0-2.fc17', package=package, release=release)
        self.db.add(build)
        self.db.flush()

        expiration_date = datetime.utcnow() + timedelta(days=1)

        data = {'nvr': build.nvr, 'notes': 'blah blah blah',
                'expiration_date': expiration_date,
                'csrf_token': self.get_csrf_token()}

        with fml_testing.mock_sends(override_schemas.BuildrootOverrideTagV1):
            res = self.app.post('/overrides/', data)

        o = res.json_body
        self.assertEqual(o['build_id'], build.id)
        self.assertEqual(o['notes'], 'blah blah blah')
        self.assertEqual(o['expiration_date'],
                         expiration_date.strftime("%Y-%m-%d %H:%M:%S"))
        self.assertEqual(o['expired_date'], None)

        # Submit it again
        data['notes'] = 'new blah blah'
        res = self.app.post('/overrides/', data)
        o = res.json_body
        new_notes = """blah blah blah

_@guest ({})_

_____________
new blah blah""".format(datetime.utcnow().strftime("%b %d, %Y"))
        self.assertEqual(o['notes'], new_notes)
Ejemplo n.º 16
0
    def test_create_override_multiple_nvr(self):
        release = Release.get('F17')
        package = RpmPackage(name='not-bodhi')
        self.db.add(package)
        build1 = RpmBuild(nvr='not-bodhi-2.0-2.fc17',
                          package=package,
                          release=release)
        self.db.add(build1)
        self.db.flush()

        package = RpmPackage(name='another-not-bodhi')
        self.db.add(package)
        build2 = RpmBuild(nvr='another-not-bodhi-2.0-2.fc17',
                          package=package,
                          release=release)
        self.db.add(build2)
        self.db.flush()

        expiration_date = datetime.utcnow() + timedelta(days=1)

        data = {
            'nvr': ','.join([build1.nvr, build2.nvr]),
            'notes': 'blah blah blah',
            'expiration_date': expiration_date,
            'csrf_token': self.get_csrf_token(),
        }

        with fml_testing.mock_sends(override_schemas.BuildrootOverrideTagV1,
                                    override_schemas.BuildrootOverrideTagV1):
            res = self.app.post('/overrides/', data)

        result = res.json_body
        self.assertEqual(result['caveats'][0]['description'],
                         'Your override submission was split into 2.')

        o1, o2 = result['overrides']
        self.assertEqual(o1['build_id'], build1.id)
        self.assertEqual(o1['notes'], 'blah blah blah')
        self.assertEqual(o1['expiration_date'],
                         expiration_date.strftime("%Y-%m-%d %H:%M:%S"))
        self.assertEqual(o1['expired_date'], None)
        self.assertEqual(o2['build_id'], build2.id)
        self.assertEqual(o2['notes'], 'blah blah blah')
        self.assertEqual(o2['expiration_date'],
                         expiration_date.strftime("%Y-%m-%d %H:%M:%S"))
        self.assertEqual(o2['expired_date'], None)
Ejemplo n.º 17
0
def create_update(session, build_nvrs, release_name='F17'):
    """
    Use the given session to create and return an Update with the given iterable of build_nvrs.

    Each build_nvr should be a string describing the name, version, and release for the build
    separated by dashes. For example, build_nvrs might look like this:

    ('bodhi-2.3.3-1.fc24', 'python-fedora-atomic-composer-2016.3-1.fc24')

    You can optionally pass a release_name to select a different release than the default F17, but
    the release must already exist in the database.

    Args:
        build_nvrs (iterable): An iterable of strings of NVRs to put into the update.
        release_name (str): The name of the release to associate with the update.
    Returns:
        bodhi.server.models.Update: The generated update.
    """
    release = session.query(Release).filter_by(name=release_name).one()
    user = session.query(User).filter_by(name='guest').one()

    builds = []
    for nvr in build_nvrs:
        name, version, rel = nvr.rsplit('-', 2)
        try:
            package = session.query(RpmPackage).filter_by(name=name).one()
        except sqlalchemy.orm.exc.NoResultFound:
            package = RpmPackage(name=name)
            session.add(package)
            testcase = TestCase(name='Wat')
            session.add(testcase)
            package.test_cases.append(testcase)

        builds.append(
            RpmBuild(nvr=nvr, release=release, package=package, signed=True))
        session.add(builds[-1])

        # Add a buildroot override for this build
        expiration_date = datetime.utcnow()
        expiration_date = expiration_date + timedelta(days=1)
        override = BuildrootOverride(build=builds[-1],
                                     submitter=user,
                                     notes='blah blah blah',
                                     expiration_date=expiration_date)
        session.add(override)

    update = Update(builds=builds,
                    user=user,
                    request=UpdateRequest.testing,
                    notes='Useful details!',
                    type=UpdateType.bugfix,
                    date_submitted=datetime(1984, 11, 2),
                    requirements='rpmlint',
                    stable_karma=3,
                    unstable_karma=-3,
                    release=release)
    session.add(update)
    return update
Ejemplo n.º 18
0
    def test_create_override_multiple_nvr(self, publish):
        release = Release.get(u'F17', self.db)
        package = RpmPackage(name=u'not-bodhi')
        self.db.add(package)
        build1 = RpmBuild(nvr=u'not-bodhi-2.0-2.fc17',
                          package=package,
                          release=release)
        self.db.add(build1)
        self.db.flush()

        package = RpmPackage(name=u'another-not-bodhi')
        self.db.add(package)
        build2 = RpmBuild(nvr=u'another-not-bodhi-2.0-2.fc17',
                          package=package,
                          release=release)
        self.db.add(build2)
        self.db.flush()

        expiration_date = datetime.utcnow() + timedelta(days=1)

        data = {
            'nvr': ','.join([build1.nvr, build2.nvr]),
            'notes': u'blah blah blah',
            'expiration_date': expiration_date,
            'csrf_token': self.get_csrf_token(),
        }
        res = self.app.post('/overrides/', data)

        self.assertEquals(len(publish.call_args_list), 2)

        result = res.json_body
        self.assertEquals(result['caveats'][0]['description'],
                          'Your override submission was split into 2.')

        o1, o2 = result['overrides']
        self.assertEquals(o1['build_id'], build1.id)
        self.assertEquals(o1['notes'], 'blah blah blah')
        self.assertEquals(o1['expiration_date'],
                          expiration_date.strftime("%Y-%m-%d %H:%M:%S"))
        self.assertEquals(o1['expired_date'], None)
        self.assertEquals(o2['build_id'], build2.id)
        self.assertEquals(o2['notes'], 'blah blah blah')
        self.assertEquals(o2['expiration_date'],
                          expiration_date.strftime("%Y-%m-%d %H:%M:%S"))
        self.assertEquals(o2['expired_date'], None)
Ejemplo n.º 19
0
    def test_create_override_too_long(self):
        release = Release.get('F17')

        package = RpmPackage(name='not-bodhi')
        self.db.add(package)
        build = RpmBuild(nvr='not-bodhi-2.0-2.fc17', package=package, release=release)
        self.db.add(build)
        self.db.flush()

        expiration_date = datetime.utcnow() + timedelta(days=60)

        data = {'nvr': build.nvr, 'notes': 'blah blah blah',
                'expiration_date': expiration_date,
                'csrf_token': self.get_csrf_token()}
        self.app.post('/overrides/', data, status=400)
Ejemplo n.º 20
0
    def test_list_builds_pagination(self):

        # First, stuff a second build in there
        session = self.db
        build = RpmBuild(nvr=u'bodhi-3.0-1.fc21')
        session.add(build)
        session.flush()

        # Then, test pagination
        res = self.app.get('/builds/', {"rows_per_page": 1})
        body = res.json_body
        self.assertEquals(len(body['builds']), 1)
        build1 = body['builds'][0]

        res = self.app.get('/builds/', {"rows_per_page": 1, "page": 2})
        body = res.json_body
        self.assertEquals(len(body['builds']), 1)
        build2 = body['builds'][0]

        self.assertNotEquals(build1, build2)
Ejemplo n.º 21
0
    def test_list_builds_pagination(self):

        # First, stuff a second build in there
        session = self.db
        build = RpmBuild(
            nvr='bodhi-3.0-1.fc21',
            package=RpmPackage.query.filter_by(name='bodhi').one())
        session.add(build)
        session.flush()

        # Then, test pagination
        res = self.app.get('/builds/', {"rows_per_page": 1})
        body = res.json_body
        assert len(body['builds']) == 1
        build1 = body['builds'][0]

        res = self.app.get('/builds/', {"rows_per_page": 1, "page": 2})
        body = res.json_body
        assert len(body['builds']) == 1
        build2 = body['builds'][0]

        assert build1 != build2
Ejemplo n.º 22
0
    def test_create_duplicate_override(self, publish):
        release = Release.get(u'F17', self.db)
        package = RpmPackage(name=u'not-bodhi')
        self.db.add(package)
        build = RpmBuild(nvr=u'not-bodhi-2.0-2.fc17',
                         package=package,
                         release=release)
        self.db.add(build)
        self.db.flush()

        expiration_date = datetime.utcnow() + timedelta(days=1)

        data = {
            'nvr': build.nvr,
            'notes': u'blah blah blah',
            'expiration_date': expiration_date,
            'csrf_token': self.get_csrf_token()
        }
        res = self.app.post('/overrides/', data)

        publish.assert_called_once_with(topic='buildroot_override.tag',
                                        msg=mock.ANY)
        self.assertEquals(len(publish.call_args_list), 1)

        o = res.json_body
        self.assertEquals(o['build_id'], build.id)
        self.assertEquals(o['notes'], 'blah blah blah')
        self.assertEquals(o['expiration_date'],
                          expiration_date.strftime("%Y-%m-%d %H:%M:%S"))
        self.assertEquals(o['expired_date'], None)

        # Submit it again
        res = self.app.post('/overrides/', data, status=400)
        self.assertEquals(
            res.json_body['errors'][0]['description'],
            'Buildroot override for %s already exists' % build.nvr)