Skip to content

Commit 3006b35

Browse files
authored
Merge pull request #10992 from eth3lbert/refresh-release-tracks
Refresh release tracks
2 parents 6f11fc8 + 123d6bb commit 3006b35

File tree

5 files changed

+140
-8
lines changed

5 files changed

+140
-8
lines changed

Diff for: app/controllers/crate/versions.js

+2-8
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ function defaultVersionsContext() {
1212
}
1313

1414
export default class SearchController extends Controller {
15+
@service releaseTracks;
1516
@service sentry;
1617
@service store;
1718

@@ -87,15 +88,8 @@ export default class SearchController extends Controller {
8788
};
8889
}
8990

90-
// set release_tracks to crate
9191
if (meta.release_tracks) {
92-
let payload = {
93-
crate: {
94-
id: crate.id,
95-
release_tracks: meta.release_tracks,
96-
},
97-
};
98-
this.store.pushPayload(payload);
92+
this.releaseTracks.updatePayload(crate.id, meta.release_tracks);
9993
}
10094

10195
return versions;

Diff for: app/models/version.js

+5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Model, { attr, belongsTo, hasMany } from '@ember-data/model';
2+
import { service } from '@ember/service';
23
import { waitForPromise } from '@ember/test-waiters';
34
import { cached } from '@glimmer/tracking';
45

@@ -12,6 +13,8 @@ import ajax from '../utils/ajax';
1213
const EIGHT_DAYS = 8 * 24 * 60 * 60 * 1000;
1314

1415
export default class Version extends Model {
16+
@service releaseTracks;
17+
1518
@attr num;
1619
@attr dl_path;
1720
@attr readme_path;
@@ -188,11 +191,13 @@ export default class Version extends Model {
188191
let data = { version: { yanked: true } };
189192
let payload = await waitForPromise(apiAction(this, { method: 'PATCH', data }));
190193
this.store.pushPayload(payload);
194+
await waitForPromise(this.releaseTracks.refreshTask.perform(this.crateName, true));
191195
});
192196

193197
unyankTask = keepLatestTask(async () => {
194198
let data = { version: { yanked: false } };
195199
let payload = await waitForPromise(apiAction(this, { method: 'PATCH', data }));
196200
this.store.pushPayload(payload);
201+
await waitForPromise(this.releaseTracks.refreshTask.perform(this.crateName, false));
197202
});
198203
}

Diff for: app/services/release-tracks.js

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import Service, { service } from '@ember/service';
2+
3+
import { didCancel, dropTask } from 'ember-concurrency';
4+
5+
import { AjaxError } from '../utils/ajax';
6+
7+
export default class PristineParamsService extends Service {
8+
@service sentry;
9+
@service store;
10+
11+
refreshTask = dropTask(async crateName => {
12+
let query = {
13+
include: 'release_tracks',
14+
name: crateName,
15+
per_page: 1,
16+
sort: 'semver',
17+
};
18+
19+
try {
20+
let versions = await this.store.query('version', query);
21+
let meta = versions.meta;
22+
if (meta.release_tracks) {
23+
this.updatePayload(crateName, meta.release_tracks);
24+
}
25+
} catch (error) {
26+
if (!didCancel(error) && !(error instanceof AjaxError)) {
27+
this.sentry.captureException(error);
28+
}
29+
}
30+
});
31+
32+
updatePayload(crateName, release_tracks) {
33+
let payload = {
34+
crate: {
35+
id: crateName,
36+
release_tracks,
37+
},
38+
};
39+
this.store.pushPayload(payload);
40+
}
41+
}

Diff for: e2e/acceptance/versions.spec.ts

+42
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,46 @@ test.describe('Acceptance | crate versions page', { tag: '@acceptance' }, () =>
2424
versions = await page.locator('[data-test-version]').evaluateAll(el => el.map(it => it.dataset.testVersion));
2525
expect(versions).toEqual(['0.3.0', '0.2.1', '0.2.0', '0.1.0']);
2626
});
27+
28+
test('shows correct release tracks label after yanking/unyanking', async ({ page, msw, percy }) => {
29+
let user = msw.db.user.create();
30+
await msw.authenticateAs(user);
31+
32+
let crate = msw.db.crate.create({ name: 'nanomsg' });
33+
msw.db.crateOwnership.create({ crate, user });
34+
35+
msw.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' });
36+
msw.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' });
37+
msw.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' });
38+
msw.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' });
39+
40+
await page.goto('/crates/nanomsg/versions');
41+
await expect(page).toHaveURL('/crates/nanomsg/versions');
42+
43+
await expect(page.locator('[data-test-version]')).toHaveCount(4);
44+
let versions = await page.locator('[data-test-version]').evaluateAll(el => el.map(it => it.dataset.testVersion));
45+
expect(versions).toEqual(['0.2.1', '0.3.0', '0.2.0', '0.1.0']);
46+
47+
let v021 = page.locator('[data-test-version="0.2.1"]');
48+
let v020 = page.locator('[data-test-version="0.2.0"]');
49+
50+
await expect(v021).toHaveClass(/.*latest/);
51+
await expect(v021).not.toHaveClass(/.yanked/);
52+
await expect(v020).not.toHaveClass(/.*latest/);
53+
await expect(v020).not.toHaveClass(/.yanked/);
54+
55+
// yanking
56+
await page.locator('[data-test-version-yank-button="0.2.1"]').click();
57+
await expect(v021).not.toHaveClass(/.*latest/);
58+
await expect(v021).toHaveClass(/.yanked/);
59+
await expect(v020).toHaveClass(/.*latest/);
60+
await expect(v020).not.toHaveClass(/.yanked/);
61+
62+
// unyanking
63+
await page.locator('[data-test-version-unyank-button="0.2.1"]').click();
64+
await expect(v021).toHaveClass(/.*latest/);
65+
await expect(v021).not.toHaveClass(/.yanked/);
66+
await expect(v020).not.toHaveClass(/.*latest/);
67+
await expect(v020).not.toHaveClass(/.yanked/);
68+
});
2769
});

Diff for: tests/acceptance/versions-test.js

+50
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,54 @@ module('Acceptance | crate versions page', function (hooks) {
2929
versions = findAll('[data-test-version]').map(it => it.dataset.testVersion);
3030
assert.deepEqual(versions, ['0.3.0', '0.2.1', '0.2.0', '0.1.0']);
3131
});
32+
33+
test('shows correct release tracks label after yanking/unyanking', async function (assert) {
34+
let user = this.db.user.create();
35+
this.authenticateAs(user);
36+
37+
let crate = this.db.crate.create({ name: 'nanomsg' });
38+
this.db.crateOwnership.create({ crate, user });
39+
40+
this.db.version.create({ crate, num: '0.1.0', created_at: '2017-01-01' });
41+
this.db.version.create({ crate, num: '0.2.0', created_at: '2018-01-01' });
42+
this.db.version.create({ crate, num: '0.3.0', created_at: '2019-01-01', rust_version: '1.69' });
43+
this.db.version.create({ crate, num: '0.2.1', created_at: '2020-01-01' });
44+
45+
await visit('/crates/nanomsg/versions');
46+
assert.strictEqual(currentURL(), '/crates/nanomsg/versions');
47+
48+
let versions = findAll('[data-test-version]').map(it => it.dataset.testVersion);
49+
assert.deepEqual(versions, ['0.2.1', '0.3.0', '0.2.0', '0.1.0']);
50+
51+
assert
52+
.dom('[data-test-version="0.2.1"]')
53+
.hasClass(/.*latest/)
54+
.hasNoClass(/.yanked/);
55+
assert
56+
.dom('[data-test-version="0.2.0"]')
57+
.hasNoClass(/.*latest/)
58+
.hasNoClass(/.yanked/);
59+
60+
// yanking
61+
await click('[data-test-version-yank-button="0.2.1"]');
62+
assert
63+
.dom('[data-test-version="0.2.1"]')
64+
.hasNoClass(/.*latest/)
65+
.hasClass(/.*yanked/);
66+
assert
67+
.dom('[data-test-version="0.2.0"]')
68+
.hasClass(/.*latest/)
69+
.hasNoClass(/.*yanked/);
70+
71+
// unyanking
72+
await click('[data-test-version-unyank-button="0.2.1"]');
73+
assert
74+
.dom('[data-test-version="0.2.1"]')
75+
.hasClass(/.*latest/)
76+
.hasNoClass(/.yanked/);
77+
assert
78+
.dom('[data-test-version="0.2.0"]')
79+
.hasNoClass(/.*latest/)
80+
.hasNoClass(/.yanked/);
81+
});
3282
});

0 commit comments

Comments
 (0)