@verdaccio/e2e-ui 2.5.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/build/cjs/features.cjs +58 -1
  2. package/build/cjs/features.cjs.map +1 -1
  3. package/build/cjs/index.cjs +20 -0
  4. package/build/cjs/index.cjs.map +1 -1
  5. package/build/cjs/tasks/publish.cjs +5 -4
  6. package/build/cjs/tasks/publish.cjs.map +1 -1
  7. package/build/cjs/testIds.cjs +16 -1
  8. package/build/cjs/testIds.cjs.map +1 -1
  9. package/build/cjs/tests/change-password.cjs +1 -2
  10. package/build/cjs/tests/change-password.cjs.map +1 -1
  11. package/build/cjs/tests/detail.cjs +106 -0
  12. package/build/cjs/tests/detail.cjs.map +1 -0
  13. package/build/cjs/tests/failure-modes.cjs +97 -0
  14. package/build/cjs/tests/failure-modes.cjs.map +1 -0
  15. package/build/cjs/tests/i18n-keys.cjs +74 -0
  16. package/build/cjs/tests/i18n-keys.cjs.map +1 -0
  17. package/build/cjs/tests/index.cjs +26 -0
  18. package/build/cjs/tests/manifest-rendering.cjs +73 -0
  19. package/build/cjs/tests/manifest-rendering.cjs.map +1 -0
  20. package/build/cjs/tests/session.cjs +49 -0
  21. package/build/cjs/tests/session.cjs.map +1 -0
  22. package/build/cjs/tests/settings.cjs +28 -0
  23. package/build/cjs/tests/settings.cjs.map +1 -1
  24. package/build/cjs/tests/signup.cjs +56 -0
  25. package/build/cjs/tests/signup.cjs.map +1 -0
  26. package/build/esm/features.js +58 -1
  27. package/build/esm/features.js.map +1 -1
  28. package/build/esm/index.js +15 -1
  29. package/build/esm/index.js.map +1 -1
  30. package/build/esm/tasks/publish.js +5 -4
  31. package/build/esm/tasks/publish.js.map +1 -1
  32. package/build/esm/testIds.js +16 -1
  33. package/build/esm/testIds.js.map +1 -1
  34. package/build/esm/tests/change-password.js +1 -2
  35. package/build/esm/tests/change-password.js.map +1 -1
  36. package/build/esm/tests/detail.js +106 -0
  37. package/build/esm/tests/detail.js.map +1 -0
  38. package/build/esm/tests/failure-modes.js +97 -0
  39. package/build/esm/tests/failure-modes.js.map +1 -0
  40. package/build/esm/tests/i18n-keys.js +74 -0
  41. package/build/esm/tests/i18n-keys.js.map +1 -0
  42. package/build/esm/tests/index.js +14 -0
  43. package/build/esm/tests/manifest-rendering.js +73 -0
  44. package/build/esm/tests/manifest-rendering.js.map +1 -0
  45. package/build/esm/tests/session.js +49 -0
  46. package/build/esm/tests/session.js.map +1 -0
  47. package/build/esm/tests/settings.js +28 -0
  48. package/build/esm/tests/settings.js.map +1 -1
  49. package/build/esm/tests/signup.js +56 -0
  50. package/build/esm/tests/signup.js.map +1 -0
  51. package/build/features.d.ts +139 -0
  52. package/build/index.d.ts +1 -1
  53. package/build/tasks/publish.d.ts +9 -0
  54. package/build/testIds.d.ts +18 -0
  55. package/build/tests/detail.d.ts +12 -0
  56. package/build/tests/failure-modes.d.ts +11 -0
  57. package/build/tests/i18n-keys.d.ts +2 -0
  58. package/build/tests/index.d.ts +6 -0
  59. package/build/tests/manifest-rendering.d.ts +14 -0
  60. package/build/tests/session.d.ts +2 -0
  61. package/build/tests/signup.d.ts +12 -0
  62. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signup.js","names":[],"sources":["../../../src/tests/signup.ts"],"sourcesContent":["/// <reference types=\"cypress\" />\nimport { maybeIt } from '../features';\nimport { RegistryConfig } from '../types';\n\n/**\n * Create-user (web signup) tests.\n *\n * Requires the server flag `createUser: true` (the /-/web/add-user page\n * redirects home without it) and the fixed signup form from\n * verdaccio/verdaccio#6210 — every published ui-theme posted to\n * `PUT /-/web/add-user:<user>`, a URL that only serves the SPA, so the\n * form could never succeed. That is exactly why this suite exists: the\n * bug lived for months because no e2e ever clicked through the flow.\n */\nexport function signupTests(config: RegistryConfig) {\n const { features } = config;\n const { signup } = config.selectors;\n\n describe('signup (create user)', () => {\n beforeEach(() => {\n cy.visit(`${config.registryUrl}/-/web/add-user`);\n cy.get('body').should('be.visible');\n });\n\n maybeIt(features.signup.happyPath)(\n 'should create a user through the real signup endpoint and land on success',\n () => {\n const username = `e2e-signup-${Date.now()}`;\n\n cy.intercept('PUT', '/-/verdaccio/sec/signup').as('signup');\n\n cy.get(signup.usernameInput).type(username);\n cy.get(signup.passwordInput).type('e2e-password');\n cy.get(signup.emailInput).type(`${username}@example.com`);\n cy.get(signup.submitButton).should('not.be.disabled').click();\n\n // Wire contract: the request must carry name/password/email and\n // the 36-char sessionId the endpoint validates before anything.\n cy.wait('@signup', { timeout: 10000 }).then((interception: any) => {\n const body = interception.request.body;\n expect(body.name).to.eq(username);\n expect(body.email).to.eq(`${username}@example.com`);\n expect(body.sessionId).to.be.a('string').with.length(36);\n expect(interception.response?.statusCode).to.be.oneOf([200, 201]);\n });\n\n cy.location('pathname', { timeout: 10000 }).should('contain', '/-/web/success');\n }\n );\n\n maybeIt(features.signup.validation)(\n 'an invalid email must show a visible message and keep submit disabled',\n () => {\n cy.get(signup.usernameInput).type('e2e-validation-user');\n cy.get(signup.passwordInput).type('e2e-password');\n cy.get(signup.emailInput).type('not-an-email');\n\n cy.get(signup.submitButton).should('be.disabled');\n // The reason must be visible, not a silently disabled button.\n cy.get(signup.emailInput)\n .closest('div.MuiFormControl-root')\n .find('.MuiFormHelperText-root')\n .should('be.visible')\n .and('not.be.empty');\n }\n );\n\n maybeIt(features.signup.validation)(\n 'a username with spaces must block submit with a visible message',\n () => {\n cy.get(signup.usernameInput).type('user name');\n cy.get(signup.passwordInput).type('e2e-password');\n cy.get(signup.emailInput).type('valid@example.com');\n\n cy.get(signup.submitButton).should('be.disabled');\n cy.get(signup.usernameInput)\n .closest('div.MuiFormControl-root')\n .find('.MuiFormHelperText-root')\n .should('be.visible')\n .and('not.be.empty');\n }\n );\n });\n}\n"],"mappings":";;;;;;;;;;;;AAcA,SAAgB,YAAY,QAAwB;CAClD,MAAM,EAAE,aAAa;CACrB,MAAM,EAAE,WAAW,OAAO;CAE1B,SAAS,8BAA8B;EACrC,iBAAiB;GACf,GAAG,MAAM,GAAG,OAAO,YAAY,gBAAgB;GAC/C,GAAG,IAAI,MAAM,CAAC,CAAC,OAAO,YAAY;EACpC,CAAC;EAED,QAAQ,SAAS,OAAO,SAAS,CAAC,CAChC,mFACM;GACJ,MAAM,WAAW,cAAc,KAAK,IAAI;GAExC,GAAG,UAAU,OAAO,yBAAyB,CAAC,CAAC,GAAG,QAAQ;GAE1D,GAAG,IAAI,OAAO,aAAa,CAAC,CAAC,KAAK,QAAQ;GAC1C,GAAG,IAAI,OAAO,aAAa,CAAC,CAAC,KAAK,cAAc;GAChD,GAAG,IAAI,OAAO,UAAU,CAAC,CAAC,KAAK,GAAG,SAAS,aAAa;GACxD,GAAG,IAAI,OAAO,YAAY,CAAC,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM;GAI5D,GAAG,KAAK,WAAW,EAAE,SAAS,IAAM,CAAC,CAAC,CAAC,MAAM,iBAAsB;IACjE,MAAM,OAAO,aAAa,QAAQ;IAClC,OAAO,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,QAAQ;IAChC,OAAO,KAAK,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,SAAS,aAAa;IAClD,OAAO,KAAK,SAAS,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,CAAC,CAAC,KAAK,OAAO,EAAE;IACvD,OAAO,aAAa,UAAU,UAAU,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC;GAClE,CAAC;GAED,GAAG,SAAS,YAAY,EAAE,SAAS,IAAM,CAAC,CAAC,CAAC,OAAO,WAAW,gBAAgB;EAChF,CACF;EAEA,QAAQ,SAAS,OAAO,UAAU,CAAC,CACjC,+EACM;GACJ,GAAG,IAAI,OAAO,aAAa,CAAC,CAAC,KAAK,qBAAqB;GACvD,GAAG,IAAI,OAAO,aAAa,CAAC,CAAC,KAAK,cAAc;GAChD,GAAG,IAAI,OAAO,UAAU,CAAC,CAAC,KAAK,cAAc;GAE7C,GAAG,IAAI,OAAO,YAAY,CAAC,CAAC,OAAO,aAAa;GAEhD,GAAG,IAAI,OAAO,UAAU,CAAC,CACtB,QAAQ,yBAAyB,CAAC,CAClC,KAAK,yBAAyB,CAAC,CAC/B,OAAO,YAAY,CAAC,CACpB,IAAI,cAAc;EACvB,CACF;EAEA,QAAQ,SAAS,OAAO,UAAU,CAAC,CACjC,yEACM;GACJ,GAAG,IAAI,OAAO,aAAa,CAAC,CAAC,KAAK,WAAW;GAC7C,GAAG,IAAI,OAAO,aAAa,CAAC,CAAC,KAAK,cAAc;GAChD,GAAG,IAAI,OAAO,UAAU,CAAC,CAAC,KAAK,mBAAmB;GAElD,GAAG,IAAI,OAAO,YAAY,CAAC,CAAC,OAAO,aAAa;GAChD,GAAG,IAAI,OAAO,aAAa,CAAC,CACzB,QAAQ,yBAAyB,CAAC,CAClC,KAAK,yBAAyB,CAAC,CAC/B,OAAO,YAAY,CAAC,CACpB,IAAI,cAAc;EACvB,CACF;CACF,CAAC;AACH"}
@@ -46,6 +46,13 @@ export interface Features {
46
46
  * builds that lag behind the upstream translation file.
47
47
  */
48
48
  languageSwitcher: boolean;
49
+ /**
50
+ * Whether to assert that dates follow the selected language
51
+ * (dayjs locale). Released UIs never load the dayjs locale, so
52
+ * relative dates stay English in every language (fixed in
53
+ * verdaccio/verdaccio#6210) — probe.
54
+ */
55
+ localizedDates: boolean;
49
56
  };
50
57
  signin: {
51
58
  /**
@@ -87,6 +94,138 @@ export interface Features {
87
94
  */
88
95
  rawViewer: boolean;
89
96
  };
97
+ detail: {
98
+ /**
99
+ * Whether to run the "visiting /v/<version> pins that version" test
100
+ * (asserts the sidebar request carries `?v=<version>`).
101
+ */
102
+ versionPinned: boolean;
103
+ /**
104
+ * Whether to run the wire-format test for scoped packages: the UI
105
+ * must request `/-/verdaccio/data/sidebar/@scope/name` with the `@`
106
+ * and `/` literal (npm registry convention), never `%40`-encoded.
107
+ * Pins the regression caught by these suites in
108
+ * verdaccio/verdaccio#6210.
109
+ */
110
+ scopedWireFormat: boolean;
111
+ /**
112
+ * Whether to run the "nonexistent version renders Not Found" test.
113
+ * Requires the server to answer 404 for unknown `?v=` values
114
+ * (verdaccio/verdaccio#6210); released lines silently fall back to
115
+ * `latest`, so this defaults to `false` as a probe.
116
+ */
117
+ versionNotFound: boolean;
118
+ /**
119
+ * Whether to run the "versions tab shows the CURRENT package after
120
+ * SPA navigation" test. The detail routes reuse one mounted
121
+ * component, and released UIs cache the previous package's versions
122
+ * in local state (fixed in verdaccio/verdaccio#6210) — defaults to
123
+ * `false` as a probe.
124
+ */
125
+ staleVersionsNavigation: boolean;
126
+ };
127
+ manifestRendering: {
128
+ /**
129
+ * Whether to run the string-form manifest tests: `repository`,
130
+ * `funding` and `bugs` in their string/array forms are valid npm
131
+ * and must render (fixed in verdaccio/verdaccio#6210) — probe.
132
+ */
133
+ stringForms: boolean;
134
+ /**
135
+ * Whether to assert gravatar avatars render on the detail sidebar.
136
+ * Released UIs read `avatar` while the sidebar endpoint sends
137
+ * `_avatar` (fixed in verdaccio/verdaccio#6210) — probe.
138
+ */
139
+ gravatarAvatars: boolean;
140
+ /**
141
+ * Whether to assert contributors without email don't collapse into
142
+ * one (fixed in verdaccio/verdaccio#6210) — probe.
143
+ */
144
+ developersWithoutEmail: boolean;
145
+ };
146
+ session: {
147
+ /**
148
+ * Whether to assert that an expired token in localStorage boots the
149
+ * UI logged out (header shows the login button). Holds on every
150
+ * released line.
151
+ */
152
+ expiredTokenLoggedOut: boolean;
153
+ /**
154
+ * Whether to assert the expired token is also PURGED from
155
+ * localStorage on boot — otherwise the api client keeps attaching
156
+ * it (fixed in verdaccio/verdaccio#6210) — probe.
157
+ */
158
+ expiredTokenPurged: boolean;
159
+ };
160
+ failureModes: {
161
+ /**
162
+ * Whether to run the "backend 5xx on the package list must not
163
+ * render the empty-registry onboarding" test. Holds on every line
164
+ * (a 5xx carries an HTTP code the UI always treated as an error).
165
+ */
166
+ homeServerError: boolean;
167
+ /**
168
+ * Whether to run the network-failure variant (request never
169
+ * reaches the server). Released UIs treat a network failure as an
170
+ * empty registry and show the onboarding card
171
+ * (verdaccio/verdaccio#6210 fixes it), so this defaults to `false`
172
+ * as a probe.
173
+ */
174
+ homeNetworkError: boolean;
175
+ /**
176
+ * Whether to run the "5xx on the detail page renders an error
177
+ * state instead of a blank page" test. Requires the generic error
178
+ * page from verdaccio/verdaccio#6210; released UIs render blank,
179
+ * so this defaults to `false` as a probe.
180
+ */
181
+ detailErrorState: boolean;
182
+ /**
183
+ * Whether to run the "search 5xx shows an error, not 'no results
184
+ * found'" test. The error state ships with verdaccio/verdaccio#6210
185
+ * — probe.
186
+ */
187
+ searchError: boolean;
188
+ /**
189
+ * Whether to run the "failed tarball download shows an error
190
+ * snackbar" test — clicking download and having nothing happen sent
191
+ * users retrying blindly (fixed in verdaccio/verdaccio#6210) — probe.
192
+ */
193
+ downloadError: boolean;
194
+ };
195
+ i18n: {
196
+ /**
197
+ * Whether to scan the home and detail pages for raw i18n keys
198
+ * (visible text like `sidebar.detail.version`). Holds on every
199
+ * released line — these pages ship fully translated.
200
+ */
201
+ noRawKeysCorePages: boolean;
202
+ /**
203
+ * Whether to scan the security pages (login dialog, /-/web/login,
204
+ * add-user, change-password) for raw i18n keys. The whole
205
+ * `security.*` namespace is missing from every published ui-theme
206
+ * bundle (fixed in verdaccio/verdaccio#6210), so this defaults to
207
+ * `false` as a probe.
208
+ */
209
+ noRawKeysSecurityPages: boolean;
210
+ };
211
+ signup: {
212
+ /**
213
+ * Whether to run the create-user happy path (fill the form on
214
+ * /-/web/add-user, submit, land on the success page) and assert
215
+ * the wire contract: `PUT /-/verdaccio/sec/signup` with a 36-char
216
+ * `sessionId`. Requires the server flag `createUser: true` AND the
217
+ * fixed signup form from verdaccio/verdaccio#6210 — every
218
+ * published ui-theme posts to a URL that only serves the SPA, so
219
+ * this defaults to `false` as a probe.
220
+ */
221
+ happyPath: boolean;
222
+ /**
223
+ * Whether to run the client-side validation tests on the add-user
224
+ * form (invalid email shows a message, url-unsafe username blocks
225
+ * submit). Same requirements as `happyPath`.
226
+ */
227
+ validation: boolean;
228
+ };
90
229
  changePassword: {
91
230
  /**
92
231
  * Whether to run the happy-path test (submit valid change,
package/build/index.d.ts CHANGED
@@ -6,7 +6,7 @@ export type { Features } from './features';
6
6
  export { DEFAULT_SELECTORS, DEFAULT_TEST_IDS } from './testIds';
7
7
  export { DEFAULT_FEATURES, maybeIt } from './features';
8
8
  export { publishPackage, cleanupPublished, unpublishPackage } from './tasks';
9
- export { homeTests, signinTests, publishTests, searchTests, settingsTests, layoutTests, changePasswordTests, } from './tests';
9
+ export { homeTests, signinTests, publishTests, searchTests, settingsTests, layoutTests, changePasswordTests, detailTests, failureModeTests, i18nKeyTests, manifestRenderingTests, sessionTests, signupTests, } from './tests';
10
10
  /**
11
11
  * Build a full RegistryConfig from user-provided options with defaults.
12
12
  *
@@ -8,6 +8,15 @@ export interface PublishPackageInput {
8
8
  };
9
9
  dependencies?: Record<string, string>;
10
10
  devDependencies?: Record<string, string>;
11
+ /**
12
+ * Extra fields merged into the generated package.json AFTER the
13
+ * defaults, so fixtures can carry arbitrary manifest shapes: a string
14
+ * `repository`, a `funding` array, `contributors` without email, a
15
+ * non-string `homepage`… — exactly the field forms npm accepts on
16
+ * publish but UIs tend to mishandle. `name`, `version` and
17
+ * `publishConfig` always win over this override.
18
+ */
19
+ manifest?: Record<string, unknown>;
11
20
  /**
12
21
  * When true, append a timestamp suffix to the version so reruns against
13
22
  * a persistent registry don't collide on 403. The suffix is a valid
@@ -116,6 +116,14 @@ export interface TestIds {
116
116
  /** Close button inside the raw viewer dialog. */
117
117
  closeRawViewer: string;
118
118
  };
119
+ errors: {
120
+ /**
121
+ * Generic error page shown when a data request fails without a
122
+ * specific status (5xx, network failure). Added by
123
+ * verdaccio/verdaccio#6210 — only present on builds with that fix.
124
+ */
125
+ genericError: string;
126
+ };
119
127
  }
120
128
  /**
121
129
  * CSS selectors (not data-testids) used by the test suites. These are
@@ -133,6 +141,16 @@ export interface Selectors {
133
141
  /** Submit button inside the login dialog. */
134
142
  submitButton: string;
135
143
  };
144
+ signup: {
145
+ /** Username input on /-/web/add-user (shares ids with the login form). */
146
+ usernameInput: string;
147
+ /** Password input on /-/web/add-user. */
148
+ passwordInput: string;
149
+ /** Email input on /-/web/add-user (only email-typed input on the page). */
150
+ emailInput: string;
151
+ /** Submit button on /-/web/add-user. */
152
+ submitButton: string;
153
+ };
136
154
  }
137
155
  /**
138
156
  * Defaults matching Verdaccio 6.x (bundled ui-theme@9.0.0-next-9.x).
@@ -0,0 +1,12 @@
1
+ import { RegistryConfig } from '../types';
2
+ /**
3
+ * Package detail page tests: version-pinned URLs and the wire format of
4
+ * the UI's data requests.
5
+ *
6
+ * The wire format is an observable contract, not an implementation
7
+ * detail: proxies, intercepts and every npm client expect scoped names
8
+ * as literal `/@scope/name`. A ui-components refactor that
9
+ * percent-encoded the `@` broke exactly these suites
10
+ * (verdaccio/verdaccio#6210), which is why it is pinned here on purpose.
11
+ */
12
+ export declare function detailTests(config: RegistryConfig): void;
@@ -0,0 +1,11 @@
1
+ import { RegistryConfig } from '../types';
2
+ /**
3
+ * Failure-mode tests: what the UI shows when the backend misbehaves.
4
+ *
5
+ * A registry that is down must never look like a healthy empty registry
6
+ * (that invites the user to publish into the void), and a failed detail
7
+ * request must render an error state instead of a blank page. These are
8
+ * the failure classes fixed by verdaccio/verdaccio#6210 — the strict
9
+ * assertions are feature-gated probes until that ships.
10
+ */
11
+ export declare function failureModeTests(config: RegistryConfig): void;
@@ -0,0 +1,2 @@
1
+ import { RegistryConfig } from '../types';
2
+ export declare function i18nKeyTests(config: RegistryConfig): void;
@@ -5,3 +5,9 @@ export { searchTests } from './search';
5
5
  export { settingsTests } from './settings';
6
6
  export { layoutTests } from './layout';
7
7
  export { changePasswordTests } from './change-password';
8
+ export { detailTests } from './detail';
9
+ export { failureModeTests } from './failure-modes';
10
+ export { i18nKeyTests } from './i18n-keys';
11
+ export { signupTests } from './signup';
12
+ export { manifestRenderingTests } from './manifest-rendering';
13
+ export { sessionTests } from './session';
@@ -0,0 +1,14 @@
1
+ import { RegistryConfig } from '../types';
2
+ /**
3
+ * Manifest-shape rendering tests.
4
+ *
5
+ * npm does not validate these fields on publish: `repository`, `funding`
6
+ * and `bugs` are all valid in string form, `funding` also as an array,
7
+ * and contributors commonly ship without an email. Real packuments carry
8
+ * all of these — the UI must render them instead of silently dropping
9
+ * whole sections (the bug family fixed in verdaccio/verdaccio#6210,
10
+ * where every probe here failed).
11
+ *
12
+ * Requires the `manifest` override support in the publishPackage task.
13
+ */
14
+ export declare function manifestRenderingTests(config: RegistryConfig): void;
@@ -0,0 +1,2 @@
1
+ import { RegistryConfig } from '../types';
2
+ export declare function sessionTests(config: RegistryConfig): void;
@@ -0,0 +1,12 @@
1
+ import { RegistryConfig } from '../types';
2
+ /**
3
+ * Create-user (web signup) tests.
4
+ *
5
+ * Requires the server flag `createUser: true` (the /-/web/add-user page
6
+ * redirects home without it) and the fixed signup form from
7
+ * verdaccio/verdaccio#6210 — every published ui-theme posted to
8
+ * `PUT /-/web/add-user:<user>`, a URL that only serves the SPA, so the
9
+ * form could never succeed. That is exactly why this suite exists: the
10
+ * bug lived for months because no e2e ever clicked through the flow.
11
+ */
12
+ export declare function signupTests(config: RegistryConfig): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/e2e-ui",
3
- "version": "2.5.0",
3
+ "version": "2.7.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Cypress plugin for Verdaccio UI e2e tests — run against any registry",