Merge ~ilasc/launchpad:update-status-report into launchpad:master

Proposed by Ioana Lasc
Status: Merged
Approved by: Ioana Lasc
Approved revision: 41fd4d8b221df1b9c7373bee4a17c3c923310d01
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~ilasc/launchpad:update-status-report
Merge into: launchpad:master
Diff against target: 175 lines (+76/-12)
4 files modified
lib/lp/code/interfaces/gitrepository.py (+25/-3)
lib/lp/code/model/gitrepository.py (+12/-1)
lib/lp/code/model/tests/test_gitrepository.py (+32/-6)
lib/lp/testing/factory.py (+7/-2)
Reviewer Review Type Date Requested Status
Colin Watson (community) Approve
Review via email: mp+414038@code.launchpad.net

Commit message

Add RevisionStatusReport.update endpoint

To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) :
review: Needs Fixing
Revision history for this message
Ioana Lasc (ilasc) wrote :

I actually found another place where I was setting the result directly instead of calling the mutator to set dates, thanks Colin!

Revision history for this message
Colin Watson (cjwatson) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/code/interfaces/gitrepository.py b/lib/lp/code/interfaces/gitrepository.py
2index e901001..888136b 100644
3--- a/lib/lp/code/interfaces/gitrepository.py
4+++ b/lib/lp/code/interfaces/gitrepository.py
5@@ -856,7 +856,8 @@ class IRevisionStatusReportEditableAttributes(Interface):
6 """
7
8 title = exported(TextLine(
9- title=_("A short title for the report."), required=True))
10+ title=_("A short title for the report."), required=True,
11+ readonly=False))
12
13 git_repository = exported(Reference(
14 title=_("The Git repository for which this report is built."),
15@@ -867,11 +868,12 @@ class IRevisionStatusReportEditableAttributes(Interface):
16 title=_("The Git commit for which this report is built."),
17 required=True, readonly=True))
18
19- url = exported(URIField(title=_("URL"), required=False, readonly=True,
20+ url = exported(URIField(title=_("URL"), required=False, readonly=False,
21 description=_("The external url of the report.")))
22
23 result_summary = exported(TextLine(
24- title=_("A short summary of the result."), required=False))
25+ title=_("A short summary of the result."), required=False,
26+ readonly=False))
27
28 result = exported(Choice(
29 title=_('Result of the report'), readonly=True,
30@@ -903,6 +905,26 @@ class IRevisionStatusReportEdit(Interface):
31 :param log_data: The contents (in bytes) of the log.
32 """
33
34+ @operation_parameters(
35+ title=TextLine(title=_("A short title for the report."),
36+ required=False),
37+ url=TextLine(title=_("The external link of the status report."),
38+ required=False),
39+ result_summary=TextLine(title=_("A short summary of the result."),
40+ required=False),
41+ result=Choice(vocabulary=RevisionStatusResult, required=False))
42+ @scoped(AccessTokenScope.REPOSITORY_BUILD_STATUS.title)
43+ @export_write_operation()
44+ @operation_for_version("devel")
45+ def update(title, url, result_summary, result):
46+ """Updates a status report.
47+
48+ :param title: A short title for the report.
49+ :param url: The external url of the report.
50+ :param result_summary: A short summary of the result.
51+ :param result: The result of the report.
52+ """
53+
54
55 @exported_as_webservice_entry(as_of="beta")
56 class IRevisionStatusReport(IRevisionStatusReportView,
57diff --git a/lib/lp/code/model/gitrepository.py b/lib/lp/code/model/gitrepository.py
58index 5e2c864..5a99c46 100644
59--- a/lib/lp/code/model/gitrepository.py
60+++ b/lib/lp/code/model/gitrepository.py
61@@ -344,8 +344,8 @@ class RevisionStatusReport(StormBase):
62 self.commit_sha1 = commit_sha1
63 self.url = url
64 self.result_summary = result_summary
65- self.result = result
66 self.date_created = UTC_NOW
67+ self.transitionToNewResult(result)
68
69 def api_setLog(self, log_data):
70 filename = '%s-%s.txt' % (self.title, self.commit_sha1)
71@@ -364,6 +364,17 @@ class RevisionStatusReport(StormBase):
72 self.date_finished = UTC_NOW
73 self.result = result
74
75+ def update(self, title=None, url=None,
76+ result_summary=None, result=None):
77+ if title is not None:
78+ self.title = title
79+ if url is not None:
80+ self.url = url
81+ if result_summary is not None:
82+ self.result_summary = result_summary
83+ if result is not None:
84+ self.transitionToNewResult(result)
85+
86
87 @implementer(IRevisionStatusReportSet)
88 class RevisionStatusReportSet:
89diff --git a/lib/lp/code/model/tests/test_gitrepository.py b/lib/lp/code/model/tests/test_gitrepository.py
90index f9be757..56f5394 100644
91--- a/lib/lp/code/model/tests/test_gitrepository.py
92+++ b/lib/lp/code/model/tests/test_gitrepository.py
93@@ -5037,15 +5037,15 @@ class TestRevisionStatusReportWebservice(TestCaseWithFactory):
94 super().setUp()
95 self.repository = self.factory.makeGitRepository()
96 self.requester = self.repository.owner
97- title = self.factory.getUniqueUnicode('report-title')
98- commit_sha1 = hashlib.sha1(b"Some content").hexdigest()
99- result_summary = "120/120 tests passed"
100+ self.title = self.factory.getUniqueUnicode('report-title')
101+ self.commit_sha1 = hashlib.sha1(b"Some content").hexdigest()
102+ self.result_summary = "120/120 tests passed"
103
104 self.report = self.factory.makeRevisionStatusReport(
105 user=self.repository.owner, git_repository=self.repository,
106- title=title, commit_sha1=commit_sha1,
107- result_summary=result_summary,
108- result=RevisionStatusResult.SUCCEEDED)
109+ title=self.title, commit_sha1=self.commit_sha1,
110+ result_summary=self.result_summary,
111+ result=RevisionStatusResult.FAILED)
112
113 self.webservice = webservice_for_person(
114 None, default_api_version="devel")
115@@ -5083,6 +5083,32 @@ class TestRevisionStatusReportWebservice(TestCaseWithFactory):
116 self.assertIn(md5, md5_of_all_artifacts)
117 self.assertIn(filesize, filesizes_of_all_artifacts)
118
119+ def test_update(self):
120+ response = self.webservice.named_post(
121+ self.report_url, "update",
122+ headers=self.header,
123+ title='updated-report-title')
124+ self.assertEqual(200, response.status)
125+ with person_logged_in(self.requester):
126+ self.assertEqual('updated-report-title', self.report.title)
127+ self.assertEqual(self.commit_sha1, self.report.commit_sha1)
128+ self.assertEqual(self.result_summary, self.report.result_summary)
129+ self.assertEqual(RevisionStatusResult.FAILED, self.report.result)
130+ date_finished_before_update = self.report.date_finished
131+ response = self.webservice.named_post(
132+ self.report_url, "update",
133+ headers=self.header,
134+ result='Succeeded')
135+ self.assertEqual(200, response.status)
136+ with person_logged_in(self.requester):
137+ self.assertEqual('updated-report-title', self.report.title)
138+ self.assertEqual(self.commit_sha1, self.report.commit_sha1)
139+ self.assertEqual(self.result_summary, self.report.result_summary)
140+ self.assertEqual(RevisionStatusResult.SUCCEEDED,
141+ self.report.result)
142+ self.assertGreater(self.report.date_finished,
143+ date_finished_before_update)
144+
145
146 class TestGitRepositoryMacaroonIssuer(MacaroonTestMixin, TestCaseWithFactory):
147 """Test GitRepository macaroon issuing and verification."""
148diff --git a/lib/lp/testing/factory.py b/lib/lp/testing/factory.py
149index 7ba28f6..7df8d8a 100644
150--- a/lib/lp/testing/factory.py
151+++ b/lib/lp/testing/factory.py
152@@ -117,6 +117,7 @@ from lp.code.enums import (
153 GitObjectType,
154 GitRepositoryType,
155 RevisionControlSystems,
156+ RevisionStatusResult,
157 TargetRevisionControlSystems,
158 )
159 from lp.code.errors import UnknownBranchTypeError
160@@ -1860,9 +1861,13 @@ class BareLaunchpadObjectFactory(ObjectFactory):
161 user = git_repository.owner
162 if commit_sha1 is None:
163 commit_sha1 = hashlib.sha1(self.getUniqueBytes()).hexdigest()
164+ if result_summary is None:
165+ result_summary = self.getUniqueUnicode()
166+ if result is None:
167+ result = RevisionStatusResult.RUNNING
168 return getUtility(IRevisionStatusReportSet).new(
169- user, title, git_repository, commit_sha1, result_summary,
170- url, result)
171+ user, title, git_repository, commit_sha1, url,
172+ result_summary, result)
173
174 def makeRevisionStatusArtifact(self, lfa=None, report=None):
175 """Create a new RevisionStatusArtifact."""

Subscribers

People subscribed via source and target branches

to status/vote changes: