Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate from ember-cli-mirage to msw and @mswjs/data #10393

Merged
merged 189 commits into from
Jan 31, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
189 commits
Select commit Hold shift + click to select a range
80d3823
git: Ignore *all* `node_modules` folders
Turbo87 Jan 14, 2025
e884806
Add basic `@crates-io/msw` package
Turbo87 Jan 14, 2025
5f94902
msw: Add `@mswjs/data` mock database
Turbo87 Jan 14, 2025
62238a9
msw: Extract custom `factory()` fn
Turbo87 Jan 15, 2025
7b4ca78
msw: Add support for `preCreate()` fns
Turbo87 Jan 15, 2025
47f2840
msw: Add support for `counter` values to the models
Turbo87 Jan 15, 2025
42e2007
msw: Extract `db.reset()` fn
Turbo87 Jan 16, 2025
15dbb4b
msw: Import `dasherize()` fn from `@ember/string`
Turbo87 Jan 15, 2025
bc236e9
msw: Implement `category` model
Turbo87 Jan 20, 2025
ccb4cef
msw: Implement `keyword` model
Turbo87 Jan 20, 2025
8894455
msw: Implement `crate` model
Turbo87 Jan 20, 2025
61a9a03
msw: Implement `user` model
Turbo87 Jan 15, 2025
31ddd22
msw: Implement `mswSession` model
Turbo87 Jan 15, 2025
e1237f7
msw: Implement `apiToken` model
Turbo87 Jan 17, 2025
a5f3281
msw: Implement `team` model
Turbo87 Jan 20, 2025
36b0bb0
msw: Implement `version` model
Turbo87 Jan 20, 2025
1a468d5
msw: Implement `versionDownload` model
Turbo87 Jan 20, 2025
c7d595f
msw: Implement `crateOwnerInvitation` model
Turbo87 Jan 20, 2025
3678f88
msw: Implement `crateOwnership` model
Turbo87 Jan 20, 2025
2a4f94f
msw: Implement `dependency` model
Turbo87 Jan 20, 2025
0abb0dd
msw: Import `underscore()` fn from `@ember/string`
Turbo87 Jan 21, 2025
2d325e4
msw: Implement basic `serializeModel()` fn
Turbo87 Jan 21, 2025
74245ce
msw: Implement `category` serializer
Turbo87 Jan 21, 2025
a931e55
msw: Implement `keyword` serializer
Turbo87 Jan 21, 2025
8403d00
msw: Implement `team` serializer
Turbo87 Jan 21, 2025
a455550
msw: Implement `user` serializer
Turbo87 Jan 21, 2025
aa45a7c
msw: Implement `invite` serializer
Turbo87 Jan 22, 2025
990f853
msw: Implement `api-token` serializer
Turbo87 Jan 22, 2025
70eabf2
msw: Implement `crate` serializer
Turbo87 Jan 23, 2025
c85158f
msw: Implement `version` serializer
Turbo87 Jan 23, 2025
404e209
msw: Implement `dependency` serializer
Turbo87 Jan 23, 2025
7dd2952
msw: Implement `getSession()` helper fn
Turbo87 Jan 21, 2025
2ebe678
msw: Implement docs.rs request handler
Turbo87 Jan 22, 2025
4c0ef9b
msw: Implement `GET /api/v1/categories` request handler
Turbo87 Jan 21, 2025
36170ae
msw: Implement `GET /api/v1/category_slugs` request handler
Turbo87 Jan 21, 2025
571ff2e
msw: Implement `GET /api/v1/categories/:category_id` request handler
Turbo87 Jan 21, 2025
ef202e4
msw: Implement `GET /api/v1/keywords` request handler
Turbo87 Jan 21, 2025
4c6eb08
msw: Implement `GET /api/v1/keywords/:keyword_id` request handler
Turbo87 Jan 21, 2025
ab1b1d5
msw: Implement `DELETE /api/private/session` request handler
Turbo87 Jan 21, 2025
14839ec
msw: Implement `GET /api/v1/site_metadata` request handler
Turbo87 Jan 15, 2025
3462a1a
msw: Implement `GET /api/v1/teams/:team_id` request handler
Turbo87 Jan 21, 2025
bc1e4a5
msw: Implement `GET /api/v1/users/:user_id` request handler
Turbo87 Jan 21, 2025
c537922
msw: Implement `PUT /api/v1/users/:user_id` request handler
Turbo87 Jan 21, 2025
11edd81
msw: Implement `PUT /api/v1/users/:user_id/resend` request handler
Turbo87 Jan 21, 2025
0329a77
msw: Implement `GET /api/v1/me` request handler
Turbo87 Jan 21, 2025
125687b
msw: Implement `GET /api/private/crate_owner_invitations` request han…
Turbo87 Jan 22, 2025
f207e28
msw: Implement `GET /api/v1/me/crate_owner_invitations` request handler
Turbo87 Jan 22, 2025
48db714
msw: Implement `PUT /api/v1/me/crate_owner_invitations/:crate_id` req…
Turbo87 Jan 22, 2025
8d57606
msw: Implement `PUT /api/v1/me/crate_owner_invitations/accept/:token`…
Turbo87 Jan 22, 2025
8df29aa
msw: Implement `PUT /api/v1/confirm/:token` request handler
Turbo87 Jan 22, 2025
a91fff1
msw: Implement `PUT /api/v1/me/tokens` request handler
Turbo87 Jan 22, 2025
3abeb17
msw: Implement `GET /api/v1/me/tokens` request handler
Turbo87 Jan 22, 2025
20d7f46
msw: Implement `DELETE /api/v1/me/tokens/:tokenId` request handler
Turbo87 Jan 22, 2025
59105c0
msw: Implement `GET /api/v1/me/tokens/:tokenId` request handler
Turbo87 Jan 22, 2025
f0da1a2
msw: Implement `GET /api/v1/crates` request handler
Turbo87 Jan 23, 2025
c26e091
msw: Implement `GET /api/v1/crates/:name` request handler
Turbo87 Jan 23, 2025
cb91248
msw: Implement `GET /api/v1/crates/:name/versions` request handler
Turbo87 Jan 23, 2025
68a3f8d
msw: Implement `GET /api/v1/crates/:name/:version` request handler
Turbo87 Jan 23, 2025
87e1a9f
msw: Implement `DELETE /api/v1/crates/:name` request handler
Turbo87 Jan 23, 2025
cbe86e2
msw: Implement `GET /api/v1/crates/:name/following` request handler
Turbo87 Jan 23, 2025
4206f5a
msw: Implement `PUT /api/v1/crates/:name/follow` request handler
Turbo87 Jan 23, 2025
e2fbce4
msw: Implement `DELETE /api/v1/crates/:name/follow` request handler
Turbo87 Jan 23, 2025
def0e95
msw: Implement `GET /api/v1/crates/:name/:version/dependencies` reque…
Turbo87 Jan 23, 2025
f2cd3d9
msw: Implement `GET /api/v1/crates/:name/:version/downloads` request …
Turbo87 Jan 23, 2025
56334bb
msw: Implement `GET /api/v1/crates/:name/owner_user` request handler
Turbo87 Jan 23, 2025
8024266
msw: Implement `GET /api/v1/crates/:name/owner_team` request handler
Turbo87 Jan 23, 2025
9bbc9b7
msw: Implement `GET /api/v1/crates/:name/downloads` request handler
Turbo87 Jan 23, 2025
29a5005
msw: Implement `GET /api/v1/crates/:name/reverse_dependencies` reques…
Turbo87 Jan 23, 2025
69ca1ae
msw: Implement `PUT /api/v1/crates/:name/owners` request handler
Turbo87 Jan 23, 2025
b2aab7f
msw: Implement `DELETE /api/v1/crates/:name/owners` request handler
Turbo87 Jan 23, 2025
1b168a8
msw: Implement `DELETE /api/v1/crates/:name/:version/yank` request ha…
Turbo87 Jan 23, 2025
b15d71c
msw: Implement `PUT /api/v1/crates/:name/:version/unyank` request han…
Turbo87 Jan 23, 2025
4ff2177
msw: Implement `GET /api/v1/crates/:name/:version/readme` request han…
Turbo87 Jan 23, 2025
81573a1
msw: Implement `PATCH /api/v1/crates/:name/:version` request handler
Turbo87 Jan 23, 2025
26434dd
msw: Implement `GET /api/v1/me/updates` request handler
Turbo87 Jan 23, 2025
14d7481
msw: Implement `GET /api/v1/summary` request handler
Turbo87 Jan 23, 2025
f7ea672
msw: Implement play.rust-lang.org request handler
Turbo87 Jan 24, 2025
583fe8e
msw: Import existing fixtures
Turbo87 Jan 24, 2025
4aac5e9
msw: Serve `mockServiceWorker.js` in dev/test mode
Turbo87 Jan 16, 2025
62c540c
msw: Add `msw: true` option to `setupApplicationTest()` fn
Turbo87 Jan 17, 2025
2e3f7c3
msw: Prevent `@mswjs/data` from bundling the `msw` package
Turbo87 Jan 24, 2025
d2474d9
tests/acceptance/api-token: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
8ff81d9
tests/acceptance/readme-rendering: Migrate from `mirage` to `@crates-…
Turbo87 Jan 24, 2025
6bcd319
tests/acceptance/front-page: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
0987e36
tests/acceptance/settings/add-owner: Migrate from `mirage` to `@crate…
Turbo87 Jan 24, 2025
24e48ef
tests/acceptance/settings/remove-owner: Migrate from `mirage` to `@cr…
Turbo87 Jan 24, 2025
2baf29d
tests/acceptance/404: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
3371f29
tests/acceptance/categories: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
a8ba731
tests/acceptance/crate-deletion: Migrate from `mirage` to `@crates-io…
Turbo87 Jan 24, 2025
a377ba1
tests/acceptance/crate-dependencies: Migrate from `mirage` to `@crate…
Turbo87 Jan 24, 2025
e558342
tests/acceptance/crate-following: Migrate from `mirage` to `@crates-i…
Turbo87 Jan 24, 2025
4515e1a
tests/acceptance/crate-navtabs: Migrate from `mirage` to `@crates-io/…
Turbo87 Jan 24, 2025
d6c7a06
tests/acceptance/crate: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
52afee6
tests/acceptance/crates: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
bdd6b7a
tests/acceptance/dashboard: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
b7e8b4e
tests/acceptance/dev-mode: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
7ad14f9
tests/acceptance/email-change: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
5d55d78
tests/acceptance/email-confirmation: Migrate from `mirage` to `@crate…
Turbo87 Jan 24, 2025
489577d
tests/acceptance/invites: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
5ac2ac7
tests/acceptance/keyword: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
2e5d704
tests/acceptance/login: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
f4e1fec
tests/acceptance/logout: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
d613e24
tests/acceptance/publish-notifications: Migrate from `mirage` to `@cr…
Turbo87 Jan 24, 2025
ad2f7b3
tests/acceptance/read-only-mode: Migrate from `mirage` to `@crates-io…
Turbo87 Jan 24, 2025
cbbf385
tests/acceptance/reverse-dependencies: Migrate from `mirage` to `@cra…
Turbo87 Jan 24, 2025
df2da96
tests/acceptance/search: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
6d86ab9
tests/acceptance/sudo: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
b29f320
tests/acceptance/support: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
5786e2d
tests/acceptance/team-page: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
3642278
tests/acceptance/token-invites: Migrate from `mirage` to `@crates-io/…
Turbo87 Jan 24, 2025
bbcbcdf
tests/acceptance/user-page: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
68a5ef8
tests/acceptance/versions: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
c8a64a0
tests/acceptance/settings: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
72481d9
tests/bugs/2329: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
679cc45
tests/bugs/4506: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
b4b458c
tests/routes/crate/version/crate-links: Migrate from `mirage` to `@cr…
Turbo87 Jan 24, 2025
a10fda0
tests/routes/crate/version/docs-link: Migrate from `mirage` to `@crat…
Turbo87 Jan 24, 2025
581a82f
tests/routes/crate/version/model: Migrate from `mirage` to `@crates-i…
Turbo87 Jan 24, 2025
e879541
tests/routes/crate/delete: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
090faf8
tests/routes/crate/range: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
e13525d
tests/routes/settings/tokens: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
7fbfb75
tests/routes/category: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
733eb4f
tests/routes/keyword: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
cb20fb8
tests/routes/support: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
38c1e48
tests/routes/team: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
bec3ce7
tests/routes/user: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
e270add
tests/adapters/crate: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
c2474e9
tests/components/crate-sidebar/playground-button: Migrate from `mirag…
Turbo87 Jan 24, 2025
03dd0fe
tests/components/crate-sidebar/toml-snippet: Migrate from `mirage` to…
Turbo87 Jan 24, 2025
088f841
tests/components/crate-row: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
2372611
tests/components/owners-list: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
4b420e4
tests/components/privileged-action: Migrate from `mirage` to `@crates…
Turbo87 Jan 24, 2025
7bafdc5
tests/components/version-list-row: Migrate from `mirage` to `@crates-…
Turbo87 Jan 24, 2025
d3b2897
tests/models/crate: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
9fb9eb2
tests/models/user: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
a87766b
tests/models/version: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
9d1e84e
tests/services/playground: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
7e62fae
tests/utils/ajax: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 24, 2025
3685a95
CI: Run `@crates-io/msw` tests in dedicated job
Turbo87 Jan 28, 2025
a6e4c9a
mirage: Start `ember-cli-mirage` server only if `window.startMirage` …
Turbo87 Jan 27, 2025
d366c39
playwright: Disable `mirage` fixture from being applied automatically
Turbo87 Jan 27, 2025
febc17b
playwright: Set default `locale` to `en-US`
Turbo87 Jan 31, 2025
55e0873
playwright: Implement basic `defer()` fn
Turbo87 Jan 27, 2025
d3dd235
playwright: Implement `msw` fixture
Turbo87 Jan 27, 2025
fe40d9c
playwright: Use `@sinonjs/fake-timers` on the test runner side too
Turbo87 Jan 27, 2025
ab27271
e2e/acceptance/front-page: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
7fe47e4
e2e/acceptance/settings/add-owner: Migrate from `mirage` to `@crates-…
Turbo87 Jan 27, 2025
3748f6f
e2e/acceptance/settings/remove-owner: Migrate from `mirage` to `@crat…
Turbo87 Jan 27, 2025
24369f8
e2e/acceptance/settings/settings: Migrate from `mirage` to `@crates-i…
Turbo87 Jan 27, 2025
aa884d7
e2e/acceptance/api-token: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
1eeb54e
e2e/acceptance/categories: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
917557a
e2e/acceptance/crate: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
cf8cec9
e2e/acceptance/crate-deletion: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
4c1a947
e2e/acceptance/crate-dependencies: Migrate from `mirage` to `@crates-…
Turbo87 Jan 27, 2025
60e4b5e
e2e/acceptance/crate-following: Migrate from `mirage` to `@crates-io/…
Turbo87 Jan 27, 2025
d7baf9f
e2e/acceptance/crate-navtabs: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
de1e94a
e2e/acceptance/crates: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
f8498a9
e2e/acceptance/dashboard: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
0d0a068
e2e/acceptance/email-change: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
8a43670
e2e/acceptance/email-confirmation: Migrate from `mirage` to `@crates-…
Turbo87 Jan 27, 2025
55648e1
e2e/acceptance/invites: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
7f9a388
e2e/acceptance/keyword: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
340e3be
e2e/acceptance/login: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
4020722
e2e/acceptance/logout: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
d26562c
e2e/acceptance/publish-notifications: Migrate from `mirage` to `@crat…
Turbo87 Jan 27, 2025
331eb63
e2e/acceptance/read-only: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
fa7bc92
e2e/acceptance/readme-rendering: Migrate from `mirage` to `@crates-io…
Turbo87 Jan 27, 2025
234756e
e2e/acceptance/reverse-dependencies: Migrate from `mirage` to `@crate…
Turbo87 Jan 27, 2025
eb1e267
e2e/acceptance/search: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
1f7c914
e2e/acceptance/sudo: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
63236b3
e2e/acceptance/support: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
525c2ce
e2e/acceptance/team-page: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
e65e192
e2e/acceptance/token-invites: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
9702df6
e2e/acceptance/user-page: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
58818a9
e2e/acceptance/versions: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 27, 2025
8ef87d3
e2e/bugs/2329: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 28, 2025
858182a
e2e/bugs/4506: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 28, 2025
68be0b4
e2e/routes/category: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 28, 2025
2423995
e2e/routes/crate/delete: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 28, 2025
c459b0e
e2e/routes/crate/range: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 28, 2025
9bc8b57
e2e/routes/crate/version/crate-links: Migrate from `mirage` to `@crat…
Turbo87 Jan 28, 2025
06542cc
e2e/routes/crate/version/docs-link: Migrate from `mirage` to `@crates…
Turbo87 Jan 28, 2025
ac446e5
e2e/routes/crate/version/model: Migrate from `mirage` to `@crates-io/…
Turbo87 Jan 28, 2025
4eaf3db
e2e/routes/keyword: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 28, 2025
b710303
e2e/routes/settings/tokens/index: Migrate from `mirage` to `@crates-i…
Turbo87 Jan 28, 2025
1ea2da8
e2e/routes/settings/tokens/new: Migrate from `mirage` to `@crates-io/…
Turbo87 Jan 28, 2025
a309609
e2e/routes/team: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 28, 2025
c34c9df
e2e/routes/user: Migrate from `mirage` to `@crates-io/msw`
Turbo87 Jan 28, 2025
a328a12
Remove obsolete `ember-cli-mirage` setup
Turbo87 Jan 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 0 additions & 9 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -107,15 +107,6 @@ module.exports = {
},
},

// mirage files
{
files: ['mirage/**/*.js'],
rules: {
// disabled because of different `.find()` meaning
'unicorn/no-array-callback-reference': 'off',
},
},

// node files
{
files: [
Expand Down
26 changes: 25 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:
files_ignore: |
app/**
e2e/**
mirage/**
packages/**
public/**
tests/**
.eslintrc
Expand Down Expand Up @@ -239,6 +239,30 @@ jobs:
- if: github.repository != 'rust-lang/crates.io'
run: pnpm test-coverage

msw-test:
name: Frontend / Test (@crates-io/msw)
runs-on: ubuntu-24.04
needs: [changed-files]
if: needs.changed-files.outputs.non-rust == 'true'

steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false

- uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0
with:
version: ${{ env.PNPM_VERSION }}

- uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
with:
cache: pnpm
node-version-file: package.json

- run: pnpm install

- run: pnpm --filter "@crates-io/msw" test

e2e-test:
name: Frontend / Test (playwright)
runs-on: ubuntu-24.04
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
/tmp

# dependencies
/node_modules
node_modules/
/bower_components
package-lock.json
yarn.lock
Expand Down
2 changes: 1 addition & 1 deletion app/templates/dashboard.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
</h2>

<div local-class="feed">
<ul local-class="feed-list">
<ul local-class="feed-list" data-test-feed-list>
{{#each this.myFeed as |version|}}
<li local-class="feed-row">
<LinkTo @route="crate.version" @models={{array version.crateName version.num}}>
Expand Down
2 changes: 0 additions & 2 deletions config/environment.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,6 @@ module.exports = function (environment) {

if (environment === 'production') {
// here you can enable a production-specific feature
delete ENV['ember-cli-mirage'];

ENV.sentry = {
dsn: process.env.SENTRY_DSN_WEB,
};
Expand Down
2 changes: 1 addition & 1 deletion docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ These files have to do with the frontend:
- `.ember-cli` - Settings for the `ember` command line interface
- `ember-cli-build.js` - Contains the build specification for Broccoli
- `.eslintrc.js` - Defines Javascript coding style guidelines (enforced during CI???)
- `mirage/` - A mock backend used during development and testing
- `node_modules/` - npm dependencies - (ignored in `.gitignore`)
- `packages/crates-io-msw` - A mock backend used for testing
- `package.json` - Defines the npm package and its dependencies
- `package-lock.json` - Locks dependencies to specific versions providing consistency across
development and deployment
Expand Down
18 changes: 6 additions & 12 deletions docs/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,18 +134,12 @@ To build and serve the frontend assets, use the command `pnpm start`. There
are variations on this command that change which backend your frontend tries to
talk to:

| Command | Backend | Use case |
| ----------------------------------------- | --------------------------------------------- | ------------------------------------------------------- |
| `pnpm start:live` | <https://crates.io> | Testing UI changes with the full live site's data |
| `pnpm start:staging` | <https://staging-crates-io.herokuapp.com> | Testing UI changes with a smaller set of realistic data |
| `pnpm start` | Static fixture test data in `mirage/fixtures` | Setting up particular situations, see note |
| `pnpm start:local` | Backend server running locally | See the Working on the backend section for setup |
| `pnpm start -- --proxy https://crates.io` | Whatever is specified in `--proxy` arg | If your use case is not covered here |

> Note: If you want to set up a particular situation, you can edit the fixture
> data used for tests in `mirage/fixtures`. The fixture data does not currently
> contain JSON needed to support every page, so some pages might not load
> correctly.
| Command | Backend | Use case |
| ----------------------------------------- | ----------------------------------------- | ------------------------------------------------------- |
| `pnpm start:live` | <https://crates.io> | Testing UI changes with the full live site's data |
| `pnpm start:staging` | <https://staging-crates-io.herokuapp.com> | Testing UI changes with a smaller set of realistic data |
| `pnpm start:local` | Backend server running locally | See the Working on the backend section for setup |
| `pnpm start -- --proxy https://crates.io` | Whatever is specified in `--proxy` arg | If your use case is not covered here |

#### Running the frontend tests

Expand Down
86 changes: 40 additions & 46 deletions e2e/acceptance/api-token.spec.ts
Original file line number Diff line number Diff line change
@@ -1,38 +1,37 @@
import { test, expect } from '@/e2e/helper';
import { expect, test } from '@/e2e/helper';
import { http, HttpResponse } from 'msw';

test.describe('Acceptance | api-tokens', { tag: '@acceptance' }, () => {
test.beforeEach(async ({ mirage }) => {
await mirage.addHook(server => {
let user = server.create('user', {
login: 'johnnydee',
name: 'John Doe',
email: '[email protected]',
avatar: 'https://avatars2.githubusercontent.com/u/1234567?v=4',
});
server.create('api-token', {
user,
name: 'BAR',
createdAt: '2017-11-19T17:59:22',
lastUsedAt: null,
expiredAt: '2017-12-19T17:59:22',
});

server.create('api-token', {
user,
name: 'recently expired',
createdAt: '2017-08-01T12:34:56',
lastUsedAt: '2017-11-02T01:45:14',
expiredAt: '2017-11-19T17:59:22',
});
server.create('api-token', {
user,
name: 'foo',
createdAt: '2017-08-01T12:34:56',
lastUsedAt: '2017-11-02T01:45:14',
});

globalThis.authenticateAs(user);
test.beforeEach(async ({ msw }) => {
let user = msw.db.user.create({
login: 'johnnydee',
name: 'John Doe',
email: '[email protected]',
avatar: 'https://avatars2.githubusercontent.com/u/1234567?v=4',
});
msw.db.apiToken.create({
user,
name: 'BAR',
createdAt: '2017-11-19T17:59:22',
lastUsedAt: null,
expiredAt: '2017-12-19T17:59:22',
});

msw.db.apiToken.create({
user,
name: 'recently expired',
createdAt: '2017-08-01T12:34:56',
lastUsedAt: '2017-11-02T01:45:14',
expiredAt: '2017-11-19T17:59:22',
});
msw.db.apiToken.create({
user,
name: 'foo',
createdAt: '2017-08-01T12:34:56',
lastUsedAt: '2017-11-02T01:45:14',
});

await msw.authenticateAs(user);
});
Turbo87 marked this conversation as resolved.
Show resolved Hide resolved

test('/me is showing the list of active API tokens', async ({ page }) => {
Expand Down Expand Up @@ -72,16 +71,13 @@ test.describe('Acceptance | api-tokens', { tag: '@acceptance' }, () => {
await expect(row3.locator('[data-test-token]')).toHaveCount(0);
});

test('API tokens can be revoked', async ({ page }) => {
test('API tokens can be revoked', async ({ page, msw }) => {
await page.goto('/settings/tokens');
await expect(page).toHaveURL('/settings/tokens');
await expect(page.locator('[data-test-api-token]')).toHaveCount(3);

await page.click('[data-test-api-token="1"] [data-test-revoke-token-button]');
expect(
await page.evaluate(() => server.schema['apiTokens'].all().length),
'API token has been deleted from the backend database',
).toBe(2);
expect(msw.db.apiToken.findMany({}).length, 'API token has been deleted from the backend database').toBe(2);

await expect(page.locator('[data-test-api-token]')).toHaveCount(2);
await expect(page.locator('[data-test-api-token="2"]')).toBeVisible();
Expand All @@ -97,12 +93,10 @@ test.describe('Acceptance | api-tokens', { tag: '@acceptance' }, () => {
await expect(page).toHaveURL('/settings/tokens/new?from=1');
});

test('failed API tokens revocation shows an error', async ({ page, mirage }) => {
await mirage.addHook(server => {
server.delete('/api/v1/me/tokens/:id', {}, 500);
});
test('failed API tokens revocation shows an error', async ({ page, msw }) => {
await msw.worker.use(http.delete('/api/v1/me/tokens/:id', () => HttpResponse.json({}, { status: 500 })));

await mirage.page.goto('/settings/tokens');
await page.goto('/settings/tokens');
await expect(page).toHaveURL('/settings/tokens');
await expect(page.locator('[data-test-api-token]')).toHaveCount(3);

Expand All @@ -115,7 +109,7 @@ test.describe('Acceptance | api-tokens', { tag: '@acceptance' }, () => {
);
});

test('new API tokens can be created', async ({ page, percy }) => {
test('new API tokens can be created', async ({ page, percy, msw }) => {
await page.goto('/settings/tokens');
await expect(page).toHaveURL('/settings/tokens');
await expect(page.locator('[data-test-api-token]')).toHaveCount(3);
Expand All @@ -129,7 +123,7 @@ test.describe('Acceptance | api-tokens', { tag: '@acceptance' }, () => {

await page.click('[data-test-generate]');

let token = await page.evaluate(() => server.schema['apiTokens'].findBy({ name: 'the new token' })?.token);
let token = msw.db.apiToken.findFirst({ where: { name: { equals: 'the new token' } } })?.token;
expect(token, 'API token has been created in the backend database').toBeTruthy();

await expect(page.locator('[data-test-api-token="4"] [data-test-name]')).toHaveText('the new token');
Expand All @@ -140,14 +134,14 @@ test.describe('Acceptance | api-tokens', { tag: '@acceptance' }, () => {
await expect(page.locator('[data-test-token]')).toHaveText(token);
});

test('API tokens are only visible in plaintext until the page is left', async ({ page }) => {
test('API tokens are only visible in plaintext until the page is left', async ({ page, msw }) => {
await page.goto('/settings/tokens');
await page.click('[data-test-new-token-button]');
await page.fill('[data-test-name]', 'the new token');
await page.click('[data-test-scope="publish-update"]');
await page.click('[data-test-generate]');

let token = await page.evaluate(() => server.schema['apiTokens'].findBy({ name: 'the new token' })?.token);
let token = msw.db.apiToken.findFirst({ where: { name: { equals: 'the new token' } } })?.token;
await expect(page.locator('[data-test-token]')).toHaveText(token);

// leave the API tokens page
Expand Down
38 changes: 15 additions & 23 deletions e2e/acceptance/categories.spec.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
import { test, expect } from '@/e2e/helper';
import { expect, test } from '@/e2e/helper';

test.describe('Acceptance | categories', { tag: '@acceptance' }, () => {
test('listing categories', async ({ page, mirage, percy, a11y }) => {
await mirage.addHook(server => {
server.create('category', { category: 'API bindings' });
server.create('category', { category: 'Algorithms' });
server.createList('crate', 1, { categoryIds: ['algorithms'] });
server.create('category', { category: 'Asynchronous' });
server.createList('crate', 15, { categoryIds: ['asynchronous'] });
server.create('category', { category: 'Everything', crates_cnt: 1234 });
});
test('listing categories', async ({ page, msw, percy, a11y }) => {
msw.db.category.create({ category: 'API bindings' });
let algos = msw.db.category.create({ category: 'Algorithms' });
msw.db.crate.create({ categories: [algos] });
let async = msw.db.category.create({ category: 'Asynchronous' });
Array.from({ length: 15 }).forEach(() => msw.db.crate.create({ categories: [async] }));
msw.db.category.create({ category: 'Everything', crates_cnt: 1234 });

await page.goto('/categories');

Expand All @@ -22,10 +20,8 @@ test.describe('Acceptance | categories', { tag: '@acceptance' }, () => {
await a11y.audit();
});

test('category/:category_id index default sort is recent-downloads', async ({ page, mirage, percy, a11y }) => {
await mirage.addHook(server => {
server.create('category', { category: 'Algorithms' });
});
test('category/:category_id index default sort is recent-downloads', async ({ page, msw, percy, a11y }) => {
msw.db.category.create({ category: 'Algorithms' });
await page.goto('/categories/algorithms');

await expect(page.locator('[data-test-category-sort] [data-test-current-order]')).toHaveText('Recent Downloads');
Expand All @@ -34,11 +30,9 @@ test.describe('Acceptance | categories', { tag: '@acceptance' }, () => {
await a11y.audit();
});

test('listing category slugs', async ({ page, mirage }) => {
await mirage.addHook(server => {
server.create('category', { category: 'Algorithms', description: 'Crates for algorithms' });
server.create('category', { category: 'Asynchronous', description: 'Async crates' });
});
test('listing category slugs', async ({ page, msw }) => {
msw.db.category.create({ category: 'Algorithms', description: 'Crates for algorithms' });
msw.db.category.create({ category: 'Asynchronous', description: 'Async crates' });
await page.goto('/category_slugs');

await expect(page.locator('[data-test-category-slug="algorithms"]')).toHaveText('algorithms');
Expand All @@ -50,10 +44,8 @@ test.describe('Acceptance | categories', { tag: '@acceptance' }, () => {

test.describe('Acceptance | categories (locale: de)', { tag: '@acceptance' }, () => {
test.use({ locale: 'de' });
test('listing categories', async ({ page, mirage }) => {
await mirage.addHook(server => {
server.create('category', { category: 'Everything', crates_cnt: 1234 });
});
test('listing categories', async ({ page, msw }) => {
msw.db.category.create({ category: 'Everything', crates_cnt: 1234 });
await page.goto('categories');

await expect(page.locator('[data-test-category="everything"] [data-test-crate-count]')).toHaveText('1.234 crates');
Expand Down
16 changes: 7 additions & 9 deletions e2e/acceptance/crate-deletion.spec.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
import { expect, test } from '@/e2e/helper';

test.describe('Acceptance | crate deletion', { tag: '@acceptance' }, () => {
test('happy path', async ({ page, mirage }) => {
await mirage.addHook(server => {
let user = server.create('user');
authenticateAs(user);
test('happy path', async ({ page, msw }) => {
let user = msw.db.user.create();
await msw.authenticateAs(user);

let crate = server.create('crate', { name: 'foo' });
server.create('version', { crate });
server.create('crate-ownership', { crate, user });
});
let crate = msw.db.crate.create({ name: 'foo' });
msw.db.version.create({ crate });
msw.db.crateOwnership.create({ crate, user });

await page.goto('/crates/foo');
await expect(page).toHaveURL('/crates/foo');
Expand All @@ -34,7 +32,7 @@ test.describe('Acceptance | crate deletion', { tag: '@acceptance' }, () => {
let message = 'Crate foo has been successfully deleted.';
await expect(page.locator('[data-test-notification-message="success"]')).toHaveText(message);

let crate = await page.evaluate(() => server.schema.crates.findBy({ name: 'foo' }));
crate = msw.db.crate.findFirst({ where: { name: { equals: 'foo' } } });
expect(crate).toBeNull();
});
});
Loading
Loading