312
317
# most recent comment first.
313
318
ds_diff = self.factory.makeDistroSeriesDifference()
315
with person_logged_in(ds_diff.owner):
320
person = self.factory.makePerson()
321
with person_logged_in(person):
316
322
dsd_comment = ds_diff.addComment(
317
ds_diff.owner, "Wait until version 2.1")
323
person, "Wait until version 2.1")
318
324
dsd_comment_2 = ds_diff.addComment(
319
ds_diff.owner, "Wait until version 2.1")
325
person, "Wait until version 2.1")
321
327
self.assertEqual(
322
328
[dsd_comment_2, dsd_comment], list(ds_diff.getComments()))
324
def test_addComment_not_public(self):
325
# Comments cannot be added with launchpad.View.
330
def test_latest_comment(self):
331
# latest_comment is a property containing the most recent comment.
326
332
ds_diff = self.factory.makeDistroSeriesDifference()
327
person = self.factory.makePerson()
329
with person_logged_in(person):
330
self.assertTrue(check_permission('launchpad.View', ds_diff))
331
self.assertFalse(check_permission('launchpad.Edit', ds_diff))
332
self.assertRaises(Unauthorized, getattr, ds_diff, 'addComment')
334
with person_logged_in(ds_diff.owner):
337
ds_diff.owner, "Wait until version 2.1"),
339
ds_diff.owner, "Wait until version 2.1"),
342
self.assertEqual(comments[-1], ds_diff.latest_comment)
334
344
def test_addComment_for_owners(self):
335
345
# Comments can be added by any of the owners of the derived
337
347
ds_diff = self.factory.makeDistroSeriesDifference()
339
with person_logged_in(ds_diff.owner):
349
person = self.factory.makePerson()
350
with person_logged_in(person):
340
351
self.assertTrue(check_permission('launchpad.Edit', ds_diff))
341
352
diff_comment = ds_diff.addComment(
342
353
ds_diff.derived_series.owner, "Boo")
371
382
sorted([packageset.name for packageset in packagesets]),
372
383
[packageset.name for packageset in ds_diff.getPackageSets()])
374
def test_blacklist_not_public(self):
375
# Differences cannot be blacklisted without edit access.
376
ds_diff = self.factory.makeDistroSeriesDifference()
377
person = self.factory.makePerson()
379
with person_logged_in(person):
380
self.assertTrue(check_permission('launchpad.View', ds_diff))
381
self.assertFalse(check_permission('launchpad.Edit', ds_diff))
382
self.assertRaises(Unauthorized, getattr, ds_diff, 'blacklist')
384
385
def test_blacklist_default(self):
385
386
# By default the current version is blacklisted.
386
387
ds_diff = self.factory.makeDistroSeriesDifference()
388
with person_logged_in(ds_diff.owner):
389
with person_logged_in(self.factory.makePerson()):
389
390
ds_diff.blacklist()
391
392
self.assertEqual(
719
723
naked_ds_diff.source_version = '1.4'
720
724
naked_ds_diff.parent_source_version = '1.5'
722
self.assertEqual(ds_diff.source_package_release.version, '1.4')
723
self.assertEqual(ds_diff.parent_source_package_release.version, '1.5')
726
self.assertEqual('1.4', ds_diff.source_package_release.version)
728
'1.5', ds_diff.parent_source_package_release.version)
730
def createPublication(self, spn, versions, distroseries,
731
status=PackagePublishingStatus.PUBLISHED):
732
changelog_lfa = self.factory.makeChangelog(spn.name, versions)
733
transaction.commit() # Yay, librarian.
734
spr = self.factory.makeSourcePackageRelease(
735
sourcepackagename=spn, version=versions[0],
736
changelog=changelog_lfa)
737
return self.factory.makeSourcePackagePublishingHistory(
738
sourcepackagerelease=spr, distroseries=distroseries,
739
status=status, pocket=PackagePublishingPocket.RELEASE)
741
def test_existing_packagediff_is_linked_when_dsd_created(self):
742
# When a relevant packagediff already exists, it is linked to the
743
# DSD when it is created.
744
derived_series = self.factory.makeDistroSeries(
745
parent_series=self.factory.makeDistroSeries())
746
spn = self.factory.getOrMakeSourcePackageName(
747
name=self.factory.getUniqueString())
748
parent_spph = self.createPublication(
749
spn, ['1.2-1', '1.0-1'], derived_series.parent_series)
750
spph = self.createPublication(
751
spn, ['1.1-1', '1.0-1'], derived_series)
752
base_spph = self.createPublication(
753
spn, ['1.0-1'], derived_series,
754
status=PackagePublishingStatus.SUPERSEDED)
755
pd = self.factory.makePackageDiff(
756
from_source=base_spph.sourcepackagerelease,
757
to_source=spph.sourcepackagerelease)
758
# factory.makeDistroSeriesDifference() will always create
759
# publications to be helpful. We don't need the help in this case.
760
dsd = getUtility(IDistroSeriesDifferenceSource).new(
762
self.assertEqual(pd, dsd.package_diff)
764
def _initDiffWithMultiplePendingPublications(self, versions, parent):
765
ds_diff = self.factory.makeDistroSeriesDifference(versions=versions)
767
series = ds_diff.derived_series.parent_series
768
version = versions.get('parent')
770
series = ds_diff.derived_series
771
version = versions.get('derived')
772
pub1 = self.factory.makeSourcePackagePublishingHistory(
773
sourcepackagename=ds_diff.source_package_name,
775
status=PackagePublishingStatus.PENDING,
777
pub2 = self.factory.makeSourcePackagePublishingHistory(
778
sourcepackagename=ds_diff.source_package_name,
780
status=PackagePublishingStatus.PENDING,
782
return ds_diff, pub1, pub2
784
def test_multiple_pending_publications_derived(self):
785
# If multiple (PENDING) publications are present in the derived
786
# series, the most recent is returned.
787
ds_diff, _, pub = self._initDiffWithMultiplePendingPublications(
788
versions={'derived': '1.0'},
792
ds_diff.source_package_release.publishings[0])
794
def test_multiple_pending_publications_parent(self):
795
# If multiple (PENDING) publications are present in the parent
796
# series, the most recent is returned.
797
ds_diff, _, pub = self._initDiffWithMultiplePendingPublications(
798
versions={'parent': '1.0'},
802
ds_diff.parent_source_package_release.publishings[0])
726
805
class DistroSeriesDifferenceLibrarianTestCase(TestCaseWithFactory):
859
938
ds_diff.derived_series, 'fooname')
861
940
self.assertEqual(ds_diff, result)
943
class TestMostRecentComments(TestCaseWithFactory):
945
layer = DatabaseFunctionalLayer
947
def test_most_recent_comments(self):
948
derived_series = self.factory.makeDistroSeries(
949
parent_series=self.factory.makeDistroSeries())
951
self.factory.makeDistroSeriesDifference(
952
derived_series=derived_series) for index in xrange(5))
953
expected_comments = set()
955
# Add a couple of comments.
956
self.factory.makeDistroSeriesDifferenceComment(dsd)
957
expected_comments.add(
958
self.factory.makeDistroSeriesDifferenceComment(dsd))
959
self.assertContentEqual(
960
expected_comments, most_recent_comments(dsds))
963
class TestMostRecentPublications(TestCaseWithFactory):
965
layer = DatabaseFunctionalLayer
967
def create_difference(self, derived_series):
968
# Create a new DistroSeriesDifference
969
version = self.factory.getUniqueInteger()
971
'base': u'1.%d' % version,
972
'derived': u'1.%dderived1' % version,
973
'parent': u'1.%d-1' % version,
975
dsd = self.factory.makeDistroSeriesDifference(
976
derived_series=derived_series,
978
# Push a base_version in... not sure how better to do it.
979
removeSecurityProxy(dsd).base_version = versions["base"]
982
def test_simple(self):
983
derived_series = self.factory.makeDistroSeries(
984
parent_series=self.factory.makeDistroSeries())
986
self.create_difference(derived_series),
987
self.create_difference(derived_series),
989
# Derived publication.
990
source_pubs_by_spn_id_expected = set(
991
(dsd.source_package_name.id, dsd.source_pub)
993
source_pubs_by_spn_id_found = most_recent_publications(
994
dsds, in_parent=False, statuses=(
995
PackagePublishingStatus.PUBLISHED,
996
PackagePublishingStatus.PENDING))
997
self.assertContentEqual(
998
source_pubs_by_spn_id_expected,
999
source_pubs_by_spn_id_found)
1000
# Parent publication
1001
parent_source_pubs_by_spn_id_expected = set(
1002
(dsd.source_package_name.id, dsd.parent_source_pub)
1004
parent_source_pubs_by_spn_id_found = most_recent_publications(
1005
dsds, in_parent=True, statuses=(
1006
PackagePublishingStatus.PUBLISHED,
1007
PackagePublishingStatus.PENDING))
1008
self.assertContentEqual(
1009
parent_source_pubs_by_spn_id_expected,
1010
parent_source_pubs_by_spn_id_found)
1012
def test_statuses(self):
1013
derived_series = self.factory.makeDistroSeries(
1014
parent_series=self.factory.makeDistroSeries())
1015
dsd = self.create_difference(derived_series)
1016
# Change the derived source publication to DELETED.
1017
removeSecurityProxy(dsd.source_pub).status = (
1018
PackagePublishingStatus.DELETED)
1019
# Searching for DELETED will find the source publication.
1020
self.assertContentEqual(
1021
[(dsd.source_package_name.id, dsd.source_pub)],
1022
most_recent_publications(
1023
[dsd], in_parent=False, statuses=(
1024
PackagePublishingStatus.DELETED,)))
1025
# Searched for DELETED will *not* find the parent publication.
1026
self.assertContentEqual(
1027
[], most_recent_publications(
1028
[dsd], in_parent=True, statuses=(
1029
PackagePublishingStatus.DELETED,)))
1031
def test_match_version(self):
1032
# When match_version is True, the version of the publications (well,
1033
# the release) must exactly match those recorded on the
1034
# DistroSeriesDifference.
1035
derived_series = self.factory.makeDistroSeries(
1036
parent_series=self.factory.makeDistroSeries())
1037
dsd = self.create_difference(derived_series)
1038
# Modify the release version.
1039
removeSecurityProxy(
1040
dsd.source_package_release.sourcepackagerelease).version += u"2"
1041
# Searching with match_version=False finds the publication.
1042
self.assertContentEqual(
1043
[(dsd.source_package_name.id, dsd.source_pub)],
1044
most_recent_publications(
1045
[dsd], in_parent=False, match_version=False,
1046
statuses=(PackagePublishingStatus.PUBLISHED,)))
1047
# Searching with match_version=True does not find the publication.
1048
self.assertContentEqual(
1049
[], most_recent_publications(
1050
[dsd], in_parent=False, match_version=True,
1051
statuses=(PackagePublishingStatus.PUBLISHED,)))