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)
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)
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()
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)
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
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')
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.")
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
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)
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)
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
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')
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)
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)
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)
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)
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
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)
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)
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)
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
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)