Merge lp:~cjwatson/launchpad/snap-fix-js-status into lp:launchpad
- snap-fix-js-status
- Merge into devel
Proposed by
Colin Watson
Status: | Merged |
---|---|
Merged at revision: | 18501 |
Proposed branch: | lp:~cjwatson/launchpad/snap-fix-js-status |
Merge into: | lp:launchpad |
Diff against target: |
343 lines (+183/-60) 7 files modified
lib/lp/app/browser/tales.py (+2/-1) lib/lp/buildmaster/javascript/buildstatus.js (+54/-0) lib/lp/snappy/javascript/snap.update_build_statuses.js (+5/-34) lib/lp/snappy/javascript/tests/test_snap.update_build_statuses.html (+2/-0) lib/lp/snappy/javascript/tests/test_snap.update_build_statuses.js (+104/-22) lib/lp/snappy/model/snap.py (+1/-1) lib/lp/snappy/tests/test_snap.py (+15/-2) |
To merge this branch: | bzr merge lp:~cjwatson/launchpad/snap-fix-js-status |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
William Grant | code | Approve | |
Review via email: mp+330015@code.launchpad.net |
Commit message
Fix AJAX update of snap builds table to handle all build statuses.
Description of the change
I suspect the original confusion was because it was cloned-and-hacked from lib/lp/
To post a comment you must log in.
Revision history for this message
William Grant (wgrant) : | # |
review:
Approve
(code)
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === renamed file 'lib/canonical/launchpad/images/build-failed.gif' => 'lib/canonical/launchpad/images/build-failed.png' | |||
2 | === modified file 'lib/lp/app/browser/tales.py' | |||
3 | --- lib/lp/app/browser/tales.py 2016-12-02 12:04:11 +0000 | |||
4 | +++ lib/lp/app/browser/tales.py 2017-08-31 14:38:35 +0000 | |||
5 | @@ -1097,6 +1097,7 @@ | |||
6 | 1097 | return '<img height="14" width="14" alt="" src="/@@/milestone" />' | 1097 | return '<img height="14" width="14" alt="" src="/@@/milestone" />' |
7 | 1098 | 1098 | ||
8 | 1099 | 1099 | ||
9 | 1100 | # Keep this in sync with lib/lp/buildmaster/javascript/build_statuses.js. | ||
10 | 1100 | class BuildImageDisplayAPI(ObjectImageDisplayAPI): | 1101 | class BuildImageDisplayAPI(ObjectImageDisplayAPI): |
11 | 1101 | """Adapter for IBuild objects to an image. | 1102 | """Adapter for IBuild objects to an image. |
12 | 1102 | 1103 | ||
13 | @@ -1119,8 +1120,8 @@ | |||
14 | 1119 | BuildStatus.CHROOTWAIT: {'src': "/@@/build-chrootwait"}, | 1120 | BuildStatus.CHROOTWAIT: {'src': "/@@/build-chrootwait"}, |
15 | 1120 | BuildStatus.SUPERSEDED: {'src': "/@@/build-superseded"}, | 1121 | BuildStatus.SUPERSEDED: {'src': "/@@/build-superseded"}, |
16 | 1121 | BuildStatus.BUILDING: {'src': "/@@/processing"}, | 1122 | BuildStatus.BUILDING: {'src': "/@@/processing"}, |
17 | 1123 | BuildStatus.FAILEDTOUPLOAD: {'src': "/@@/build-failedtoupload"}, | ||
18 | 1122 | BuildStatus.UPLOADING: {'src': "/@@/processing"}, | 1124 | BuildStatus.UPLOADING: {'src': "/@@/processing"}, |
19 | 1123 | BuildStatus.FAILEDTOUPLOAD: {'src': "/@@/build-failedtoupload"}, | ||
20 | 1124 | BuildStatus.CANCELLING: {'src': "/@@/processing"}, | 1125 | BuildStatus.CANCELLING: {'src': "/@@/processing"}, |
21 | 1125 | BuildStatus.CANCELLED: {'src': "/@@/build-failed"}, | 1126 | BuildStatus.CANCELLED: {'src': "/@@/build-failed"}, |
22 | 1126 | } | 1127 | } |
23 | 1127 | 1128 | ||
24 | === added directory 'lib/lp/buildmaster/javascript' | |||
25 | === added file 'lib/lp/buildmaster/javascript/buildstatus.js' | |||
26 | --- lib/lp/buildmaster/javascript/buildstatus.js 1970-01-01 00:00:00 +0000 | |||
27 | +++ lib/lp/buildmaster/javascript/buildstatus.js 2017-08-31 14:38:35 +0000 | |||
28 | @@ -0,0 +1,54 @@ | |||
29 | 1 | /* Copyright 2017 Canonical Ltd. This software is licensed under the | ||
30 | 2 | * GNU Affero General Public License version 3 (see the file LICENSE). | ||
31 | 3 | * | ||
32 | 4 | * Build status handling. | ||
33 | 5 | * | ||
34 | 6 | * @module Y.lp.buildmaster.buildstatus | ||
35 | 7 | */ | ||
36 | 8 | YUI.add('lp.buildmaster.buildstatus', function(Y) { | ||
37 | 9 | var module = Y.namespace('lp.buildmaster.buildstatus'); | ||
38 | 10 | |||
39 | 11 | // Keep this in sync with | ||
40 | 12 | // lib/lp/app/browser/tales.py:BuildImageDisplayAPI. | ||
41 | 13 | var icon_map = { | ||
42 | 14 | NEEDSBUILD: { src: '/@@/build-needed' }, | ||
43 | 15 | FULLYBUILT: { src: '/@@/build-success' }, | ||
44 | 16 | FAILEDTOBUILD: { | ||
45 | 17 | src: '/@@/build-failed', | ||
46 | 18 | width: 16 | ||
47 | 19 | }, | ||
48 | 20 | MANUALDEPWAIT: { src: '/@@/build-depwait' }, | ||
49 | 21 | CHROOTWAIT: { src: '/@@/build-chrootwait' }, | ||
50 | 22 | SUPERSEDED: { src: '/@@/build-superseded' }, | ||
51 | 23 | BUILDING: { src: '/@@/processing' }, | ||
52 | 24 | FAILEDTOUPLOAD: { src: '/@@/build-failedtoupload' }, | ||
53 | 25 | UPLOADING: { src: '/@@/processing' }, | ||
54 | 26 | CANCELLING: { src: '/@@/processing' }, | ||
55 | 27 | CANCELLED: { src: '/@@/build-failed' } | ||
56 | 28 | }; | ||
57 | 29 | |||
58 | 30 | module.update_build_status = function(node, build_summary) { | ||
59 | 31 | var link_node = node.one('a'); | ||
60 | 32 | var img_node = node.one('img'); | ||
61 | 33 | |||
62 | 34 | if (link_node === null || img_node === null) { | ||
63 | 35 | return false; | ||
64 | 36 | } | ||
65 | 37 | |||
66 | 38 | if (node.hasClass(build_summary.status)) { | ||
67 | 39 | return false; | ||
68 | 40 | } | ||
69 | 41 | if (!(build_summary.status in icon_map)) { | ||
70 | 42 | return false; | ||
71 | 43 | } | ||
72 | 44 | icon_props = icon_map[build_summary.status]; | ||
73 | 45 | |||
74 | 46 | node.setAttribute('class', 'build_status'); | ||
75 | 47 | node.addClass(build_summary.status); | ||
76 | 48 | link_node.set('innerHTML', build_summary.buildstate); | ||
77 | 49 | img_node.setAttribute('alt', '[' + build_summary.status + ']'); | ||
78 | 50 | img_node.setAttribute('title', build_summary.buildstate); | ||
79 | 51 | img_node.setAttribute('src', icon_props.src); | ||
80 | 52 | img_node.setAttribute('width', icon_props.width || 14); | ||
81 | 53 | }; | ||
82 | 54 | }, '0.1', {'requires': []}); | ||
83 | 0 | 55 | ||
84 | === modified file 'lib/lp/snappy/javascript/snap.update_build_statuses.js' | |||
85 | --- lib/lp/snappy/javascript/snap.update_build_statuses.js 2016-05-14 00:25:07 +0000 | |||
86 | +++ lib/lp/snappy/javascript/snap.update_build_statuses.js 2017-08-31 14:38:35 +0000 | |||
87 | @@ -5,7 +5,8 @@ | |||
88 | 5 | * LP DynamicDomUpdater plugin for updating the latest builds table of a snap. | 5 | * LP DynamicDomUpdater plugin for updating the latest builds table of a snap. |
89 | 6 | * | 6 | * |
90 | 7 | * @module Y.lp.snappy.snap.update_build_statuses | 7 | * @module Y.lp.snappy.snap.update_build_statuses |
92 | 8 | * @requires anim, node, lp.anim, lp.soyuz.dynamic_dom_updater | 8 | * @requires anim, node, lp.anim, lp.buildmaster.buildstatus, |
93 | 9 | * lp.soyuz.dynamic_dom_updater | ||
94 | 9 | */ | 10 | */ |
95 | 10 | YUI.add('lp.snappy.snap.update_build_statuses', function(Y) { | 11 | YUI.add('lp.snappy.snap.update_build_statuses', function(Y) { |
96 | 11 | Y.log('loading lp.snappy.snap.update_build_statuses'); | 12 | Y.log('loading lp.snappy.snap.update_build_statuses'); |
97 | @@ -30,40 +31,9 @@ | |||
98 | 30 | return; | 31 | return; |
99 | 31 | } | 32 | } |
100 | 32 | 33 | ||
109 | 33 | var link_node = td_build_status.one("a"); | 34 | if (Y.lp.buildmaster.buildstatus.update_build_status( |
110 | 34 | var img_node = td_build_status.one("img"); | 35 | td_build_status, build_summary)) { |
103 | 35 | |||
104 | 36 | if (link_node === null || img_node === null) { | ||
105 | 37 | return; | ||
106 | 38 | } | ||
107 | 39 | |||
108 | 40 | if (!td_build_status.hasClass(build_summary.status)) { | ||
111 | 41 | ui_changed = true; | 36 | ui_changed = true; |
112 | 42 | var new_src = null; | ||
113 | 43 | switch(build_summary.status) { | ||
114 | 44 | case 'BUILDING': | ||
115 | 45 | case 'UPLOADING': | ||
116 | 46 | new_src = '/@@/processing'; | ||
117 | 47 | break; | ||
118 | 48 | case 'NEEDSBUILD': | ||
119 | 49 | new_src = '/@@/build-needed'; | ||
120 | 50 | break; | ||
121 | 51 | case 'FAILEDTOBUILD': | ||
122 | 52 | new_src = '/@@/build-failed'; | ||
123 | 53 | break; | ||
124 | 54 | case 'FULLYBUILT_PENDING': | ||
125 | 55 | new_src = '/@@/build-success-publishing'; | ||
126 | 56 | break; | ||
127 | 57 | default: | ||
128 | 58 | new_src = '/@@/build-success'; | ||
129 | 59 | } | ||
130 | 60 | |||
131 | 61 | td_build_status.setAttribute("class", "build_status"); | ||
132 | 62 | td_build_status.addClass(build_summary.status); | ||
133 | 63 | link_node.set("innerHTML", build_summary.buildstate); | ||
134 | 64 | img_node.setAttribute("src", new_src); | ||
135 | 65 | img_node.setAttribute("title", build_summary.buildstate); | ||
136 | 66 | img_node.setAttribute("alt", "[" + build_summary.status + "]"); | ||
137 | 67 | } | 37 | } |
138 | 68 | 38 | ||
139 | 69 | if (build_summary.when_complete !== null) { | 39 | if (build_summary.when_complete !== null) { |
140 | @@ -137,4 +107,5 @@ | |||
141 | 137 | }, "0.1", {"requires":["anim", | 107 | }, "0.1", {"requires":["anim", |
142 | 138 | "node", | 108 | "node", |
143 | 139 | "lp.anim", | 109 | "lp.anim", |
144 | 110 | "lp.buildmaster.buildstatus", | ||
145 | 140 | "lp.soyuz.dynamic_dom_updater"]}); | 111 | "lp.soyuz.dynamic_dom_updater"]}); |
146 | 141 | 112 | ||
147 | === modified file 'lib/lp/snappy/javascript/tests/test_snap.update_build_statuses.html' | |||
148 | --- lib/lp/snappy/javascript/tests/test_snap.update_build_statuses.html 2016-05-14 00:25:07 +0000 | |||
149 | +++ lib/lp/snappy/javascript/tests/test_snap.update_build_statuses.html 2017-08-31 14:38:35 +0000 | |||
150 | @@ -34,6 +34,8 @@ | |||
151 | 34 | <script type="text/javascript" | 34 | <script type="text/javascript" |
152 | 35 | src="../../../../../build/js/lp/app/extras/extras.js"></script> | 35 | src="../../../../../build/js/lp/app/extras/extras.js"></script> |
153 | 36 | <script type="text/javascript" | 36 | <script type="text/javascript" |
154 | 37 | src="../../../../../build/js/lp/buildmaster/buildstatus.js"></script> | ||
155 | 38 | <script type="text/javascript" | ||
156 | 37 | src="../../../../../build/js/lp/soyuz/lp_dynamic_dom_updater.js"></script> | 39 | src="../../../../../build/js/lp/soyuz/lp_dynamic_dom_updater.js"></script> |
157 | 38 | <script type="text/javascript" | 40 | <script type="text/javascript" |
158 | 39 | src="../../../../../build/js/lp/app/testing/assert.js"></script> | 41 | src="../../../../../build/js/lp/app/testing/assert.js"></script> |
159 | 40 | 42 | ||
160 | === modified file 'lib/lp/snappy/javascript/tests/test_snap.update_build_statuses.js' | |||
161 | --- lib/lp/snappy/javascript/tests/test_snap.update_build_statuses.js 2017-07-21 17:35:14 +0000 | |||
162 | +++ lib/lp/snappy/javascript/tests/test_snap.update_build_statuses.js 2017-08-31 14:38:35 +0000 | |||
163 | @@ -63,28 +63,110 @@ | |||
164 | 63 | this.td_status.setAttribute("class", this.td_status_class); | 63 | this.td_status.setAttribute("class", this.td_status_class); |
165 | 64 | }, | 64 | }, |
166 | 65 | 65 | ||
189 | 66 | test_update_build_status_dom: function() { | 66 | test_update_build_status_dom_building: function() { |
190 | 67 | var original_a_href = this.td_status_a.get("href"); | 67 | var original_a_href = this.td_status_a.get("href"); |
191 | 68 | var data = { | 68 | var data = { |
192 | 69 | "1": { | 69 | "1": { |
193 | 70 | "status": "BUILDING", | 70 | "status": "BUILDING", |
194 | 71 | "build_log_url": null, | 71 | "build_log_url": null, |
195 | 72 | "when_complete_estimate": true, | 72 | "when_complete_estimate": true, |
196 | 73 | "buildstate": "Currently building", | 73 | "buildstate": "Currently building", |
197 | 74 | "build_log_size": null, | 74 | "build_log_size": null, |
198 | 75 | "when_complete": "in 1 minute" | 75 | "when_complete": "in 1 minute" |
199 | 76 | } | 76 | } |
200 | 77 | }; | 77 | }; |
201 | 78 | module.domUpdate(this.table, data); | 78 | module.domUpdate(this.table, data); |
202 | 79 | Y.Assert.areEqual( | 79 | Y.Assert.areEqual( |
203 | 80 | "build_status BUILDING", this.td_status.getAttribute("class")); | 80 | "build_status BUILDING", this.td_status.getAttribute("class")); |
204 | 81 | Y.Assert.areEqual( | 81 | Y.Assert.areEqual( |
205 | 82 | "Currently building", this.td_status.get("text").trim()); | 82 | "Currently building", this.td_status.get("text").trim()); |
206 | 83 | Y.Assert.areEqual("[BUILDING]", this.td_status_img.get("alt")); | 83 | Y.Assert.areEqual("[BUILDING]", this.td_status_img.get("alt")); |
207 | 84 | Y.Assert.areEqual( | 84 | Y.Assert.areEqual( |
208 | 85 | "Currently building", this.td_status_img.get("title")); | 85 | "Currently building", this.td_status_img.get("title")); |
209 | 86 | Y.Assert.areEqual( | 86 | Y.Assert.areEqual( |
210 | 87 | "file:///@@/processing", this.td_status_img.get("src")); | 87 | "file:///@@/processing", this.td_status_img.get("src")); |
211 | 88 | Y.Assert.areEqual("14", this.td_status_img.get("width")); | ||
212 | 89 | Y.Assert.areEqual(original_a_href, this.td_status_a.get("href")); | ||
213 | 90 | }, | ||
214 | 91 | |||
215 | 92 | test_update_build_status_dom_building: function() { | ||
216 | 93 | var original_a_href = this.td_status_a.get("href"); | ||
217 | 94 | var data = { | ||
218 | 95 | "1": { | ||
219 | 96 | "status": "BUILDING", | ||
220 | 97 | "build_log_url": null, | ||
221 | 98 | "when_complete_estimate": true, | ||
222 | 99 | "buildstate": "Currently building", | ||
223 | 100 | "build_log_size": null, | ||
224 | 101 | "when_complete": "in 1 minute" | ||
225 | 102 | } | ||
226 | 103 | }; | ||
227 | 104 | module.domUpdate(this.table, data); | ||
228 | 105 | Y.Assert.areEqual( | ||
229 | 106 | "build_status BUILDING", this.td_status.getAttribute("class")); | ||
230 | 107 | Y.Assert.areEqual( | ||
231 | 108 | "Currently building", this.td_status.get("text").trim()); | ||
232 | 109 | Y.Assert.areEqual("[BUILDING]", this.td_status_img.get("alt")); | ||
233 | 110 | Y.Assert.areEqual( | ||
234 | 111 | "Currently building", this.td_status_img.get("title")); | ||
235 | 112 | Y.Assert.areEqual( | ||
236 | 113 | "file:///@@/processing", this.td_status_img.get("src")); | ||
237 | 114 | Y.Assert.areEqual("14", this.td_status_img.get("width")); | ||
238 | 115 | Y.Assert.areEqual(original_a_href, this.td_status_a.get("href")); | ||
239 | 116 | }, | ||
240 | 117 | |||
241 | 118 | test_update_build_status_dom_failedtobuild: function() { | ||
242 | 119 | var original_a_href = this.td_status_a.get("href"); | ||
243 | 120 | var data = { | ||
244 | 121 | "1": { | ||
245 | 122 | "status": "FAILEDTOBUILD", | ||
246 | 123 | "build_log_url": null, | ||
247 | 124 | "when_complete_estimate": false, | ||
248 | 125 | "buildstate": "Failed to build", | ||
249 | 126 | "build_log_size": null, | ||
250 | 127 | "when_complete": "1 minute ago" | ||
251 | 128 | } | ||
252 | 129 | }; | ||
253 | 130 | module.domUpdate(this.table, data); | ||
254 | 131 | Y.Assert.areEqual( | ||
255 | 132 | "build_status FAILEDTOBUILD", | ||
256 | 133 | this.td_status.getAttribute("class")); | ||
257 | 134 | Y.Assert.areEqual( | ||
258 | 135 | "Failed to build", this.td_status.get("text").trim()); | ||
259 | 136 | Y.Assert.areEqual( | ||
260 | 137 | "[FAILEDTOBUILD]", this.td_status_img.get("alt")); | ||
261 | 138 | Y.Assert.areEqual( | ||
262 | 139 | "Failed to build", this.td_status_img.get("title")); | ||
263 | 140 | Y.Assert.areEqual( | ||
264 | 141 | "file:///@@/build-failed", this.td_status_img.get("src")); | ||
265 | 142 | Y.Assert.areEqual("16", this.td_status_img.get("width")); | ||
266 | 143 | Y.Assert.areEqual(original_a_href, this.td_status_a.get("href")); | ||
267 | 144 | }, | ||
268 | 145 | |||
269 | 146 | test_update_build_status_dom_chrootwait: function() { | ||
270 | 147 | var original_a_href = this.td_status_a.get("href"); | ||
271 | 148 | var data = { | ||
272 | 149 | "1": { | ||
273 | 150 | "status": "CHROOTWAIT", | ||
274 | 151 | "build_log_url": null, | ||
275 | 152 | "when_complete_estimate": false, | ||
276 | 153 | "buildstate": "Chroot problem", | ||
277 | 154 | "build_log_size": null, | ||
278 | 155 | "when_complete": "1 minute ago" | ||
279 | 156 | } | ||
280 | 157 | }; | ||
281 | 158 | module.domUpdate(this.table, data); | ||
282 | 159 | Y.Assert.areEqual( | ||
283 | 160 | "build_status CHROOTWAIT", | ||
284 | 161 | this.td_status.getAttribute("class")); | ||
285 | 162 | Y.Assert.areEqual( | ||
286 | 163 | "Chroot problem", this.td_status.get("text").trim()); | ||
287 | 164 | Y.Assert.areEqual("[CHROOTWAIT]", this.td_status_img.get("alt")); | ||
288 | 165 | Y.Assert.areEqual( | ||
289 | 166 | "Chroot problem", this.td_status_img.get("title")); | ||
290 | 167 | Y.Assert.areEqual( | ||
291 | 168 | "file:///@@/build-chrootwait", this.td_status_img.get("src")); | ||
292 | 169 | Y.Assert.areEqual("14", this.td_status_img.get("width")); | ||
293 | 88 | Y.Assert.areEqual(original_a_href, this.td_status_a.get("href")); | 170 | Y.Assert.areEqual(original_a_href, this.td_status_a.get("href")); |
294 | 89 | }, | 171 | }, |
295 | 90 | 172 | ||
296 | 91 | 173 | ||
297 | === modified file 'lib/lp/snappy/model/snap.py' | |||
298 | --- lib/lp/snappy/model/snap.py 2017-06-29 12:02:11 +0000 | |||
299 | +++ lib/lp/snappy/model/snap.py 2017-08-31 14:38:35 +0000 | |||
300 | @@ -537,7 +537,7 @@ | |||
301 | 537 | 537 | ||
302 | 538 | result[build.id] = { | 538 | result[build.id] = { |
303 | 539 | "status": build.status.name, | 539 | "status": build.status.name, |
305 | 540 | "buildstate": build.status, | 540 | "buildstate": build.status.title, |
306 | 541 | "when_complete": when_complete, | 541 | "when_complete": when_complete, |
307 | 542 | "when_complete_estimate": build.estimate, | 542 | "when_complete_estimate": build.estimate, |
308 | 543 | "build_log_url": build.log_url, | 543 | "build_log_url": build.log_url, |
309 | 544 | 544 | ||
310 | === modified file 'lib/lp/snappy/tests/test_snap.py' | |||
311 | --- lib/lp/snappy/tests/test_snap.py 2017-04-24 13:38:04 +0000 | |||
312 | +++ lib/lp/snappy/tests/test_snap.py 2017-08-31 14:38:35 +0000 | |||
313 | @@ -23,6 +23,8 @@ | |||
314 | 23 | from storm.locals import Store | 23 | from storm.locals import Store |
315 | 24 | from testtools.matchers import ( | 24 | from testtools.matchers import ( |
316 | 25 | Equals, | 25 | Equals, |
317 | 26 | Is, | ||
318 | 27 | MatchesDict, | ||
319 | 26 | MatchesSetwise, | 28 | MatchesSetwise, |
320 | 27 | MatchesStructure, | 29 | MatchesStructure, |
321 | 28 | ) | 30 | ) |
322 | @@ -420,8 +422,19 @@ | |||
323 | 420 | summary1 = snap1.getBuildSummariesForSnapBuildIds( | 422 | summary1 = snap1.getBuildSummariesForSnapBuildIds( |
324 | 421 | [build11.id, build12.id]) | 423 | [build11.id, build12.id]) |
325 | 422 | summary2 = snap2.getBuildSummariesForSnapBuildIds([build2.id]) | 424 | summary2 = snap2.getBuildSummariesForSnapBuildIds([build2.id]) |
328 | 423 | self.assertContentEqual([build11.id, build12.id], summary1.keys()) | 425 | summary_matcher = MatchesDict({ |
329 | 424 | self.assertContentEqual([build2.id], summary2.keys()) | 426 | "status": Equals("NEEDSBUILD"), |
330 | 427 | "buildstate": Equals("Needs building"), | ||
331 | 428 | "when_complete": Is(None), | ||
332 | 429 | "when_complete_estimate": Is(False), | ||
333 | 430 | "build_log_url": Is(None), | ||
334 | 431 | "build_log_size": Is(None), | ||
335 | 432 | }) | ||
336 | 433 | self.assertThat(summary1, MatchesDict({ | ||
337 | 434 | build11.id: summary_matcher, | ||
338 | 435 | build12.id: summary_matcher, | ||
339 | 436 | })) | ||
340 | 437 | self.assertThat(summary2, MatchesDict({build2.id: summary_matcher})) | ||
341 | 425 | 438 | ||
342 | 426 | def test_getBuildSummariesForSnapBuildIds_empty_input(self): | 439 | def test_getBuildSummariesForSnapBuildIds_empty_input(self): |
343 | 427 | snap = self.factory.makeSnap() | 440 | snap = self.factory.makeSnap() |