@nextsparkjs/theme-default 0.1.0-beta.31 → 0.1.0-beta.35

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 (149) hide show
  1. package/lib/selectors.ts +5 -1
  2. package/package.json +2 -2
  3. package/tests/cypress/e2e/{_devtools → _utils/devtools}/access.cy.ts +3 -3
  4. package/tests/cypress/e2e/{_devtools → _utils/devtools}/navigation.cy.ts +3 -3
  5. package/tests/cypress/e2e/{_devtools → _utils/devtools}/pages.cy.ts +3 -3
  6. package/tests/cypress/e2e/_utils/selectors/auth.bdd.md +354 -0
  7. package/tests/cypress/e2e/{_selectors → _utils/selectors}/auth.cy.ts +39 -35
  8. package/tests/cypress/e2e/_utils/selectors/billing.bdd.md +276 -0
  9. package/tests/cypress/e2e/_utils/selectors/billing.cy.ts +182 -0
  10. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.bdd.md +205 -0
  11. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.cy.ts +137 -0
  12. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.bdd.md +147 -0
  13. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.cy.ts +114 -0
  14. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.bdd.md +111 -0
  15. package/tests/cypress/e2e/{_selectors → _utils/selectors}/dashboard-sidebar.cy.ts +35 -6
  16. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.bdd.md +200 -0
  17. package/tests/cypress/e2e/{_selectors → _utils/selectors}/dashboard-topnav.cy.ts +30 -43
  18. package/tests/cypress/e2e/_utils/selectors/devtools.bdd.md +306 -0
  19. package/tests/cypress/e2e/{_selectors → _utils/selectors}/devtools.cy.ts +77 -14
  20. package/tests/cypress/e2e/_utils/selectors/global-search.bdd.md +115 -0
  21. package/tests/cypress/e2e/{_selectors → _utils/selectors}/global-search.cy.ts +15 -10
  22. package/tests/cypress/e2e/_utils/selectors/pages-editor.bdd.md +207 -0
  23. package/tests/cypress/e2e/{_selectors → _utils/selectors}/pages-editor.cy.ts +44 -12
  24. package/tests/cypress/e2e/_utils/selectors/posts-editor.bdd.md +184 -0
  25. package/tests/cypress/e2e/{_selectors → _utils/selectors}/posts-editor.cy.ts +107 -39
  26. package/tests/cypress/e2e/{_selectors → _utils/selectors}/public.cy.ts +1 -1
  27. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.bdd.md +266 -0
  28. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-api-keys.cy.ts +30 -25
  29. package/tests/cypress/e2e/_utils/selectors/settings-billing.bdd.md +78 -0
  30. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-billing.cy.ts +10 -7
  31. package/tests/cypress/e2e/_utils/selectors/settings-layout.bdd.md +138 -0
  32. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-layout.cy.ts +12 -8
  33. package/tests/cypress/e2e/_utils/selectors/settings-password.bdd.md +82 -0
  34. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-password.cy.ts +10 -7
  35. package/tests/cypress/e2e/_utils/selectors/settings-profile.bdd.md +77 -0
  36. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-profile.cy.ts +15 -18
  37. package/tests/cypress/e2e/_utils/selectors/settings-teams.bdd.md +130 -0
  38. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-teams.cy.ts +36 -18
  39. package/tests/cypress/e2e/_utils/selectors/superadmin.bdd.md +261 -0
  40. package/tests/cypress/e2e/{_selectors → _utils/selectors}/superadmin.cy.ts +23 -15
  41. package/tests/cypress/e2e/_utils/selectors/tasks.bdd.md +353 -0
  42. package/tests/cypress/e2e/{_selectors → _utils/selectors}/tasks.cy.ts +11 -10
  43. package/tests/cypress/e2e/{_selectors → _utils/selectors}/taxonomies.cy.ts +1 -1
  44. package/tests/cypress/e2e/_utils/selectors/teams.bdd.md +278 -0
  45. package/tests/cypress/e2e/{_selectors → _utils/selectors}/teams.cy.ts +90 -37
  46. package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-teams.cy.ts +4 -4
  47. package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-users.cy.ts +4 -4
  48. package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/dashboard.cy.ts +4 -4
  49. package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/subscriptions-overview.cy.ts +4 -4
  50. package/tests/cypress/e2e/api/{entities → _core/users}/users-security.cy.ts +2 -2
  51. package/tests/cypress/e2e/uat/{auth → _core/auth}/login-logout.cy.ts +2 -2
  52. package/tests/cypress/e2e/uat/{auth → _core/auth}/password-reset.cy.ts +1 -1
  53. package/tests/cypress/e2e/uat/{billing → _core/billing}/extended.cy.ts +2 -2
  54. package/tests/cypress/e2e/uat/{billing → _core/billing}/feature-gates.cy.ts +2 -2
  55. package/tests/cypress/e2e/uat/{billing → _core/billing}/page.cy.ts +2 -2
  56. package/tests/cypress/e2e/uat/{billing → _core/billing}/status.cy.ts +2 -2
  57. package/tests/cypress/e2e/uat/{billing → _core/billing}/team-switch.cy.ts +2 -2
  58. package/tests/cypress/e2e/uat/{billing → _core/billing}/usage.cy.ts +2 -2
  59. package/tests/cypress/e2e/uat/{devtools → _core/devtools}/api-tester.cy.ts +2 -2
  60. package/tests/cypress/e2e/uat/{scheduled-actions → _core/scheduled-actions}/devtools-ui.cy.ts +2 -2
  61. package/tests/cypress/e2e/uat/{teams → _core/teams}/roles-matrix.cy.ts +2 -2
  62. package/tests/cypress/e2e/uat/{teams → _core/teams}/switcher.cy.ts +2 -2
  63. package/tests/cypress/e2e/uat/{roles → features/roles}/editor-role.cy.ts +2 -2
  64. package/tests/cypress/e2e/uat/{roles → features/roles}/member-restrictions.cy.ts +3 -3
  65. package/tests/cypress/e2e/uat/{roles → features/roles}/owner-full-crud.cy.ts +2 -2
  66. package/tests/cypress/src/core/DashboardEntityPOM.ts +2 -2
  67. package/tests/cypress/src/features/DashboardPOM.ts +2 -2
  68. package/tests/cypress/src/features/DevtoolsPOM.ts +12 -1
  69. package/tests/cypress/src/session-helpers.ts +35 -17
  70. package/tests/cypress/support/e2e.ts +2 -1
  71. package/tests/cypress.config.ts +29 -10
  72. package/tests/tsconfig.json +13 -7
  73. package/tests/cypress/e2e/_selectors/billing.cy.ts +0 -89
  74. package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +0 -113
  75. package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +0 -89
  76. /package/tests/cypress/e2e/{_devtools → _utils/devtools}/access.bdd.md +0 -0
  77. /package/tests/cypress/e2e/{_devtools → _utils/devtools}/navigation.bdd.md +0 -0
  78. /package/tests/cypress/e2e/{_devtools → _utils/devtools}/pages.bdd.md +0 -0
  79. /package/tests/cypress/e2e/{_docs → _utils/docs}/README.md +0 -0
  80. /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/sector7-superadmin-teams.narration.json +0 -0
  81. /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/sector7-superadmin.cy.ts +0 -0
  82. /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/teams-system.doc.cy.ts +0 -0
  83. /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/teams-system.narration.json +0 -0
  84. /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-teams.bdd.md +0 -0
  85. /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-users.bdd.md +0 -0
  86. /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/dashboard.bdd.md +0 -0
  87. /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/subscriptions-overview.bdd.md +0 -0
  88. /package/tests/cypress/e2e/api/{billing → _core/billing}/BillingAPIController.js +0 -0
  89. /package/tests/cypress/e2e/api/{billing → _core/billing}/check-action.cy.ts +0 -0
  90. /package/tests/cypress/e2e/api/{billing → _core/billing}/checkout.cy.ts +0 -0
  91. /package/tests/cypress/e2e/api/{billing → _core/billing}/lifecycle.cy.ts +0 -0
  92. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/README.md +0 -0
  93. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/business.cy.ts +0 -0
  94. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/downgrade.cy.ts +0 -0
  95. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/fixtures/billing-plans.json +0 -0
  96. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/free.cy.ts +0 -0
  97. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/pro.cy.ts +0 -0
  98. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/starter.cy.ts +0 -0
  99. /package/tests/cypress/e2e/api/{billing → _core/billing}/portal.cy.ts +0 -0
  100. /package/tests/cypress/e2e/api/{devtools → _core/devtools}/registries.bdd.md +0 -0
  101. /package/tests/cypress/e2e/api/{devtools → _core/devtools}/registries.cy.ts +0 -0
  102. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/cron-endpoint.bdd.md +0 -0
  103. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/cron-endpoint.cy.ts +0 -0
  104. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/devtools-endpoint.bdd.md +0 -0
  105. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/devtools-endpoint.cy.ts +0 -0
  106. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/scheduling.bdd.md +0 -0
  107. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/scheduling.cy.ts +0 -0
  108. /package/tests/cypress/e2e/api/{settings → _core/settings}/api-keys.crud.cy.ts +0 -0
  109. /package/tests/cypress/e2e/api/{entities → _core/users}/users-crud.cy.ts +0 -0
  110. /package/tests/cypress/e2e/api/{entities → _core/users}/users-metas.cy.ts +0 -0
  111. /package/tests/cypress/e2e/api/entities/{customers-crud.cy.ts → customers/customers-crud.cy.ts} +0 -0
  112. /package/tests/cypress/e2e/api/entities/{customers-metas.cy.ts → customers/customers-metas.cy.ts} +0 -0
  113. /package/tests/cypress/e2e/api/entities/{blocks-scope.cy.ts → pages/blocks-scope.cy.ts} +0 -0
  114. /package/tests/cypress/e2e/api/entities/{pages-crud.cy.ts → pages/pages-crud.cy.ts} +0 -0
  115. /package/tests/cypress/e2e/api/entities/{pages-status.cy.ts → pages/pages-status.cy.ts} +0 -0
  116. /package/tests/cypress/e2e/api/entities/{post-categories-crud.cy.ts → posts/post-categories-crud.cy.ts} +0 -0
  117. /package/tests/cypress/e2e/api/entities/{posts-crud.cy.ts → posts/posts-crud.cy.ts} +0 -0
  118. /package/tests/cypress/e2e/api/entities/{posts-status.cy.ts → posts/posts-status.cy.ts} +0 -0
  119. /package/tests/cypress/e2e/api/entities/{tasks-crud.cy.ts → tasks/tasks-crud.cy.ts} +0 -0
  120. /package/tests/cypress/e2e/api/entities/{tasks-metas.cy.ts → tasks/tasks-metas.cy.ts} +0 -0
  121. /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/developer-login.bdd.md +0 -0
  122. /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/developer-login.cy.ts +0 -0
  123. /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/superadmin-login.bdd.md +0 -0
  124. /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/superadmin-login.cy.ts +0 -0
  125. /package/tests/cypress/e2e/uat/{auth → _core/auth}/custom-roles/editor-login.bdd.md +0 -0
  126. /package/tests/cypress/e2e/uat/{auth → _core/auth}/custom-roles/editor-login.cy.ts +0 -0
  127. /package/tests/cypress/e2e/uat/{auth → _core/auth}/login-logout.bdd.md +0 -0
  128. /package/tests/cypress/e2e/uat/{auth → _core/auth}/password-reset.bdd.md +0 -0
  129. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/admin-login.bdd.md +0 -0
  130. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/admin-login.cy.ts +0 -0
  131. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/member-login.bdd.md +0 -0
  132. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/member-login.cy.ts +0 -0
  133. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/owner-login.bdd.md +0 -0
  134. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/owner-login.cy.ts +0 -0
  135. /package/tests/cypress/e2e/uat/{billing → _core/billing}/extended.bdd.md +0 -0
  136. /package/tests/cypress/e2e/uat/{billing → _core/billing}/feature-gates.bdd.md +0 -0
  137. /package/tests/cypress/e2e/uat/{billing → _core/billing}/page.bdd.md +0 -0
  138. /package/tests/cypress/e2e/uat/{billing → _core/billing}/status.bdd.md +0 -0
  139. /package/tests/cypress/e2e/uat/{billing → _core/billing}/team-switch.bdd.md +0 -0
  140. /package/tests/cypress/e2e/uat/{billing → _core/billing}/usage.bdd.md +0 -0
  141. /package/tests/cypress/e2e/uat/{blocks → _core/blocks}/hero.bdd.md +0 -0
  142. /package/tests/cypress/e2e/uat/{blocks → _core/blocks}/hero.cy.ts +0 -0
  143. /package/tests/cypress/e2e/uat/{scheduled-actions → _core/scheduled-actions}/devtools-ui.bdd.md +0 -0
  144. /package/tests/cypress/e2e/uat/{teams → _core/teams}/roles-matrix.bdd.md +0 -0
  145. /package/tests/cypress/e2e/uat/{teams → _core/teams}/switcher.bdd.md +0 -0
  146. /package/tests/cypress/e2e/uat/{teams → _core/teams}/team-switcher.md +0 -0
  147. /package/tests/cypress/e2e/uat/{roles → features/roles}/editor-role.bdd.md +0 -0
  148. /package/tests/cypress/e2e/uat/{roles → features/roles}/member-restrictions.bdd.md +0 -0
  149. /package/tests/cypress/e2e/uat/{roles → features/roles}/owner-full-crud.bdd.md +0 -0
package/lib/selectors.ts CHANGED
@@ -134,11 +134,15 @@ export const DEVTOOLS_SELECTORS = {
134
134
 
135
135
  /**
136
136
  * Complete theme selectors merging core and blocks.
137
+ * NOTE: devtools must be MERGED (not replaced) to keep CORE_SELECTORS.devtools
137
138
  */
138
139
  export const THEME_SELECTORS = {
139
140
  ...CORE_SELECTORS,
140
141
  blocks: BLOCK_SELECTORS,
141
- devtools: DEVTOOLS_SELECTORS,
142
+ devtools: {
143
+ ...CORE_SELECTORS.devtools,
144
+ ...DEVTOOLS_SELECTORS,
145
+ },
142
146
  } as const
143
147
 
144
148
  // =============================================================================
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextsparkjs/theme-default",
3
- "version": "0.1.0-beta.31",
3
+ "version": "0.1.0-beta.35",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./config/theme.config.ts",
@@ -17,7 +17,7 @@
17
17
  "react-dom": "^19.0.0",
18
18
  "react-markdown": "^10.1.0",
19
19
  "zod": "^4.0.0",
20
- "@nextsparkjs/core": "0.1.0-beta.31"
20
+ "@nextsparkjs/core": "0.1.0-beta.36"
21
21
  },
22
22
  "nextspark": {
23
23
  "type": "theme",
@@ -1,13 +1,13 @@
1
1
  /// <reference types="cypress" />
2
2
 
3
3
  import * as allure from 'allure-cypress'
4
- import { DevtoolsPOM } from '../../src/features/DevtoolsPOM'
4
+ import { DevtoolsPOM } from '../../../src/features/DevtoolsPOM'
5
5
  import {
6
6
  loginAsDefaultDeveloper,
7
7
  loginAsDefaultSuperadmin,
8
8
  loginAsDefaultMember,
9
9
  CORE_USERS
10
- } from '../../src/session-helpers'
10
+ } from '../../../src/session-helpers'
11
11
 
12
12
  /**
13
13
  * DevTools Access Control Tests
@@ -25,7 +25,7 @@ import {
25
25
  */
26
26
 
27
27
  describe('DevTools - Access Control', {
28
- tags: ['@uat', '@feat-devtools', '@smoke', '@regression']
28
+ tags: ['@uat', '@area-devtools', '@smoke', '@regression']
29
29
  }, () => {
30
30
  const devtools = DevtoolsPOM.create()
31
31
 
@@ -1,8 +1,8 @@
1
1
  /// <reference types="cypress" />
2
2
 
3
3
  import * as allure from 'allure-cypress'
4
- import { DevtoolsPOM } from '../../src/features/DevtoolsPOM'
5
- import { loginAsDefaultDeveloper } from '../../src/session-helpers'
4
+ import { DevtoolsPOM } from '../../../src/features/DevtoolsPOM'
5
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
6
6
 
7
7
  /**
8
8
  * DevTools Navigation Tests
@@ -18,7 +18,7 @@ import { loginAsDefaultDeveloper } from '../../src/session-helpers'
18
18
  */
19
19
 
20
20
  describe('DevTools - Navigation', {
21
- tags: ['@uat', '@feat-devtools', '@regression']
21
+ tags: ['@uat', '@area-devtools', '@regression']
22
22
  }, () => {
23
23
  const devtools = DevtoolsPOM.create()
24
24
 
@@ -1,8 +1,8 @@
1
1
  /// <reference types="cypress" />
2
2
 
3
3
  import * as allure from 'allure-cypress'
4
- import { DevtoolsPOM } from '../../src/features/DevtoolsPOM'
5
- import { loginAsDefaultDeveloper } from '../../src/session-helpers'
4
+ import { DevtoolsPOM } from '../../../src/features/DevtoolsPOM'
5
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
6
6
 
7
7
  /**
8
8
  * DevTools Page Content Tests
@@ -18,7 +18,7 @@ import { loginAsDefaultDeveloper } from '../../src/session-helpers'
18
18
  */
19
19
 
20
20
  describe('DevTools - Page Content', {
21
- tags: ['@uat', '@feat-devtools', '@regression']
21
+ tags: ['@uat', '@area-devtools', '@regression']
22
22
  }, () => {
23
23
  const devtools = DevtoolsPOM.create()
24
24
 
@@ -0,0 +1,354 @@
1
+ ---
2
+ feature: Auth UI Selectors Validation
3
+ priority: high
4
+ tags: [selectors, auth, ui-validation]
5
+ grepTags: [ui-selectors, auth, SEL_AUTH_001, SEL_AUTH_002, SEL_AUTH_003, SEL_AUTH_004, SEL_AUTH_005, SEL_AUTH_006, SEL_AUTH_007]
6
+ coverage: 7
7
+ ---
8
+
9
+ # Auth UI Selectors Validation
10
+
11
+ > Validates that authentication component selectors exist in the DOM. This is a lightweight test that ONLY checks selector presence, not functionality. Runs as Phase 12 sub-gate before functional tests.
12
+
13
+ ## @test SEL_AUTH_001: Login Card Structure
14
+
15
+ ### Metadata
16
+ - **Priority:** High
17
+ - **Type:** Selector Validation
18
+ - **Tags:** login, card, structure
19
+ - **Grep:** `@ui-selectors` `@SEL_AUTH_001`
20
+ - **Status:** Active - 6 tests
21
+
22
+ ```gherkin:en
23
+ Scenario: Login page has complete card structure
24
+
25
+ Given I navigate to the login page
26
+ And the login card is visible
27
+ Then I should find the login card element
28
+ And I should find the login header
29
+ And I should find the login footer
30
+ And I should find the signup link
31
+ And I should find the Google signin button
32
+ And I should find the show email button
33
+ ```
34
+
35
+ ```gherkin:es
36
+ Scenario: Pagina de login tiene estructura de card completa
37
+
38
+ Given navego a la pagina de login
39
+ And la card de login esta visible
40
+ Then deberia encontrar el elemento card de login
41
+ And deberia encontrar el header de login
42
+ And deberia encontrar el footer de login
43
+ And deberia encontrar el link de signup
44
+ And deberia encontrar el boton de Google signin
45
+ And deberia encontrar el boton de mostrar email
46
+ ```
47
+
48
+ ### Expected Results
49
+ - `auth.login.card` selector exists
50
+ - `auth.login.header` selector exists
51
+ - `auth.login.footer` selector exists
52
+ - `auth.login.signupLink` selector exists
53
+ - `auth.login.googleButton` selector exists
54
+ - `auth.login.showEmailButton` selector exists
55
+
56
+ ---
57
+
58
+ ## @test SEL_AUTH_002: Login Form Inputs
59
+
60
+ ### Metadata
61
+ - **Priority:** High
62
+ - **Type:** Selector Validation
63
+ - **Tags:** login, form, inputs
64
+ - **Grep:** `@ui-selectors` `@SEL_AUTH_002`
65
+ - **Status:** Active - 11 tests
66
+
67
+ ```gherkin:en
68
+ Scenario: Login form has all required input selectors
69
+
70
+ Given I navigate to the login page
71
+ And I click the show email button
72
+ And the login form is visible
73
+ Then I should find the login form element
74
+ And I should find the email input
75
+ And I should find the password input
76
+ And I should find the submit button
77
+ And I should find the forgot password link
78
+ And I should find the hide email button
79
+ And I should find the remember checkbox
80
+ When I click submit without filling fields
81
+ Then I should find the email error message
82
+ When I fill email and click submit
83
+ Then I should find the password error message
84
+ When I fill both fields with invalid credentials and submit
85
+ Then I should find the login error alert
86
+ ```
87
+
88
+ ```gherkin:es
89
+ Scenario: Formulario de login tiene todos los selectores de input requeridos
90
+
91
+ Given navego a la pagina de login
92
+ And hago clic en el boton de mostrar email
93
+ And el formulario de login esta visible
94
+ Then deberia encontrar el elemento formulario de login
95
+ And deberia encontrar el input de email
96
+ And deberia encontrar el input de password
97
+ And deberia encontrar el boton de submit
98
+ And deberia encontrar el link de olvide password
99
+ And deberia encontrar el boton de ocultar email
100
+ And deberia encontrar el checkbox de recordar
101
+ When hago clic en submit sin llenar campos
102
+ Then deberia encontrar el mensaje de error de email
103
+ When lleno email y hago clic en submit
104
+ Then deberia encontrar el mensaje de error de password
105
+ When lleno ambos campos con credenciales invalidas y envio
106
+ Then deberia encontrar la alerta de error de login
107
+ ```
108
+
109
+ ### Expected Results
110
+ - `auth.login.form` selector exists
111
+ - `auth.login.options` selector exists
112
+ - `auth.login.emailInput` selector exists
113
+ - `auth.login.passwordInput` selector exists
114
+ - `auth.login.submitButton` selector exists
115
+ - `auth.login.forgotPasswordLink` selector exists
116
+ - `auth.login.hideEmailButton` selector exists
117
+ - `auth.login.rememberCheckbox` selector exists
118
+ - `auth.login.emailError` selector appears on validation failure
119
+ - `auth.login.passwordError` selector appears on validation failure
120
+ - `auth.login.error` selector appears after failed login attempt
121
+
122
+ ---
123
+
124
+ ## @test SEL_AUTH_003: Signup Form
125
+
126
+ ### Metadata
127
+ - **Priority:** High
128
+ - **Type:** Selector Validation
129
+ - **Tags:** signup, form, inputs
130
+ - **Grep:** `@ui-selectors` `@SEL_AUTH_003`
131
+ - **Status:** Partial - 9 passing, 1 skipped (Google button)
132
+
133
+ ```gherkin:en
134
+ Scenario: Signup form has all required input selectors
135
+
136
+ Given I navigate to the signup page
137
+ And the signup form is visible
138
+ Then I should find the signup form element
139
+ And I should find the first name input
140
+ And I should find the last name input
141
+ And I should find the email input
142
+ And I should find the password input
143
+ And I should find the confirm password input
144
+ And I should find the submit button
145
+ And I should find the Google signup button
146
+ And I should find the login link
147
+ When I fill the form with an existing email and submit
148
+ Then I should find the signup error message
149
+ ```
150
+
151
+ ```gherkin:es
152
+ Scenario: Formulario de signup tiene todos los selectores de input requeridos
153
+
154
+ Given navego a la pagina de signup
155
+ And el formulario de signup esta visible
156
+ Then deberia encontrar el elemento formulario de signup
157
+ And deberia encontrar el input de nombre
158
+ And deberia encontrar el input de apellido
159
+ And deberia encontrar el input de email
160
+ And deberia encontrar el input de password
161
+ And deberia encontrar el input de confirmar password
162
+ And deberia encontrar el boton de submit
163
+ And deberia encontrar el boton de Google signup
164
+ And deberia encontrar el link de login
165
+ When lleno el formulario con un email existente y envio
166
+ Then deberia encontrar el mensaje de error de signup
167
+ ```
168
+
169
+ ### Expected Results
170
+ - `auth.signup.form` selector exists
171
+ - `auth.signup.firstNameInput` selector exists
172
+ - `auth.signup.lastNameInput` selector exists
173
+ - `auth.signup.emailInput` selector exists
174
+ - `auth.signup.passwordInput` selector exists
175
+ - `auth.signup.confirmPasswordInput` selector exists
176
+ - `auth.signup.submitButton` selector exists
177
+ - `auth.signup.googleButton` selector exists
178
+ - `auth.signup.loginLink` selector exists
179
+ - `auth.signup.error` selector appears when email already exists
180
+
181
+ ---
182
+
183
+ ## @test SEL_AUTH_004: Forgot Password
184
+
185
+ ### Metadata
186
+ - **Priority:** Medium
187
+ - **Type:** Selector Validation
188
+ - **Tags:** forgot-password, form
189
+ - **Grep:** `@ui-selectors` `@SEL_AUTH_004`
190
+ - **Status:** Partial - 4 passing, 4 skipped (require states)
191
+
192
+ ```gherkin:en
193
+ Scenario: Forgot password page has all required selectors
194
+
195
+ Given I navigate to the forgot password page
196
+ And the forgot password form is visible
197
+ Then I should find the forgot password form element
198
+ And I should find the email input
199
+ And I should find the submit button
200
+ And I should find the back to login link
201
+ ```
202
+
203
+ ```gherkin:es
204
+ Scenario: Pagina de olvide password tiene todos los selectores requeridos
205
+
206
+ Given navego a la pagina de olvide password
207
+ And el formulario de olvide password esta visible
208
+ Then deberia encontrar el elemento formulario de olvide password
209
+ And deberia encontrar el input de email
210
+ And deberia encontrar el boton de submit
211
+ And deberia encontrar el link de volver a login
212
+ ```
213
+
214
+ ### Expected Results
215
+ - `auth.forgotPassword.form` selector exists
216
+ - `auth.forgotPassword.emailInput` selector exists
217
+ - `auth.forgotPassword.submitButton` selector exists
218
+ - `auth.forgotPassword.backLink` selector exists
219
+
220
+ ### Skipped Tests (require specific states)
221
+ - `auth.forgotPassword.success` - requires successful email submission
222
+ - `auth.forgotPassword.successBackLink` - requires success state
223
+ - `auth.forgotPassword.retryButton` - requires success state
224
+ - `auth.forgotPassword.error` - requires server error
225
+
226
+ ---
227
+
228
+ ## @test SEL_AUTH_005: DevKeyring
229
+
230
+ ### Metadata
231
+ - **Priority:** Medium
232
+ - **Type:** Selector Validation
233
+ - **Tags:** devkeyring, development
234
+ - **Grep:** `@ui-selectors` `@SEL_AUTH_005`
235
+ - **Status:** Active - 4 tests
236
+
237
+ ```gherkin:en
238
+ Scenario: DevKeyring component has all required selectors
239
+
240
+ Given I navigate to the login page
241
+ And the login card is visible
242
+ Then I should find the devkeyring container
243
+ And I should find the devkeyring trigger
244
+ When I click the devkeyring trigger
245
+ Then I should find the devkeyring content
246
+ And I should find at least one devkeyring user option
247
+ ```
248
+
249
+ ```gherkin:es
250
+ Scenario: Componente DevKeyring tiene todos los selectores requeridos
251
+
252
+ Given navego a la pagina de login
253
+ And la card de login esta visible
254
+ Then deberia encontrar el contenedor de devkeyring
255
+ And deberia encontrar el trigger de devkeyring
256
+ When hago clic en el trigger de devkeyring
257
+ Then deberia encontrar el contenido de devkeyring
258
+ And deberia encontrar al menos una opcion de usuario de devkeyring
259
+ ```
260
+
261
+ ### Expected Results
262
+ - `auth.devKeyring.container` selector exists
263
+ - `auth.devKeyring.trigger` selector exists
264
+ - `auth.devKeyring.content` selector exists when opened
265
+ - `auth.devKeyring.user(0)` selector exists (at least one user)
266
+
267
+ ---
268
+
269
+ ## @test SEL_AUTH_006: Reset Password
270
+
271
+ ### Metadata
272
+ - **Priority:** Low
273
+ - **Type:** Selector Validation
274
+ - **Tags:** reset-password, form
275
+ - **Grep:** `@ui-selectors` `@SEL_AUTH_006`
276
+ - **Status:** Skipped - requires valid reset token
277
+
278
+ ```gherkin:en
279
+ Scenario: Reset password page has all required selectors
280
+
281
+ Given I have a valid password reset token
282
+ And I navigate to the reset password page with the token
283
+ Then I should find the reset password form element
284
+ And I should find the password input
285
+ And I should find the confirm password input
286
+ And I should find the submit button
287
+ ```
288
+
289
+ ```gherkin:es
290
+ Scenario: Pagina de reset password tiene todos los selectores requeridos
291
+
292
+ Given tengo un token valido de reset password
293
+ And navego a la pagina de reset password con el token
294
+ Then deberia encontrar el elemento formulario de reset password
295
+ And deberia encontrar el input de password
296
+ And deberia encontrar el input de confirmar password
297
+ And deberia encontrar el boton de submit
298
+ ```
299
+
300
+ ### Expected Results (when token is valid)
301
+ - `auth.resetPassword.form` selector exists
302
+ - `auth.resetPassword.password` selector exists
303
+ - `auth.resetPassword.confirmPassword` selector exists
304
+ - `auth.resetPassword.submitButton` selector exists
305
+ - `auth.resetPassword.error` selector appears on validation failure
306
+
307
+ ### Notes
308
+ All tests in this section are skipped because they require a valid reset token which cannot be generated in automated tests without email access.
309
+
310
+ ---
311
+
312
+ ## @test SEL_AUTH_007: Verify Email
313
+
314
+ ### Metadata
315
+ - **Priority:** Low
316
+ - **Type:** Selector Validation
317
+ - **Tags:** verify-email, email
318
+ - **Grep:** `@ui-selectors` `@SEL_AUTH_007`
319
+ - **Status:** Skipped - requires pending verification state
320
+
321
+ ```gherkin:en
322
+ Scenario: Verify email page has all required selectors
323
+
324
+ Given I have just signed up and need to verify email
325
+ And I am on the verify email page
326
+ Then I should find the verify email container
327
+ And I should find the resend button
328
+ When verification is complete
329
+ Then I should find the success message
330
+ When verification fails
331
+ Then I should find the error message
332
+ ```
333
+
334
+ ```gherkin:es
335
+ Scenario: Pagina de verificar email tiene todos los selectores requeridos
336
+
337
+ Given acabo de registrarme y necesito verificar email
338
+ And estoy en la pagina de verificar email
339
+ Then deberia encontrar el contenedor de verificar email
340
+ And deberia encontrar el boton de reenviar
341
+ When la verificacion se completa
342
+ Then deberia encontrar el mensaje de exito
343
+ When la verificacion falla
344
+ Then deberia encontrar el mensaje de error
345
+ ```
346
+
347
+ ### Expected Results (when in verification state)
348
+ - `auth.verifyEmail.container` selector exists
349
+ - `auth.verifyEmail.resendButton` selector exists
350
+ - `auth.verifyEmail.success` selector appears on successful verification
351
+ - `auth.verifyEmail.error` selector appears on verification failure
352
+
353
+ ### Notes
354
+ All tests in this section are skipped because they require a pending email verification state which cannot be reliably set up in automated tests.
@@ -13,20 +13,28 @@
13
13
  * - Navigate to auth pages (NO login required - public pages)
14
14
  * - Assert elements exist in DOM (no form submissions)
15
15
  * - Fast execution (< 30 seconds per describe block)
16
+ *
17
+ * Test IDs:
18
+ * - SEL_AUTH_001: Login Card Structure
19
+ * - SEL_AUTH_002: Login Form Inputs
20
+ * - SEL_AUTH_003: Signup Form
21
+ * - SEL_AUTH_004: Forgot Password
22
+ * - SEL_AUTH_005: DevKeyring
23
+ * - SEL_AUTH_006: Reset Password (skipped - requires token)
24
+ * - SEL_AUTH_007: Verify Email (skipped - requires state)
16
25
  */
17
26
 
18
- import { AuthPOM } from '../../src/core/AuthPOM'
27
+ import { AuthPOM } from '../../../src/core/AuthPOM'
19
28
 
20
- describe('Auth Selectors Validation', { tags: ['@ui-selectors'] }, () => {
29
+ describe('Auth Selectors Validation', { tags: ['@ui-selectors', '@auth'] }, () => {
21
30
  const auth = AuthPOM.create()
22
31
 
23
32
  // ============================================
24
- // LOGIN PAGE SELECTORS (18 selectors)
33
+ // SEL_AUTH_001: LOGIN CARD STRUCTURE
25
34
  // ============================================
26
- describe('Login Page Selectors - Card & Structure', () => {
35
+ describe('SEL_AUTH_001: Login Card Structure', { tags: '@SEL_AUTH_001' }, () => {
27
36
  beforeEach(() => {
28
37
  auth.visitLogin()
29
- // Wait for card to be visible (form may not be visible by default)
30
38
  cy.get(auth.selectors.loginCard, { timeout: 10000 }).should('be.visible')
31
39
  })
32
40
 
@@ -54,16 +62,17 @@ describe('Auth Selectors Validation', { tags: ['@ui-selectors'] }, () => {
54
62
  cy.get(auth.selectors.loginShowEmail).should('exist')
55
63
  })
56
64
 
57
- // Note: Invite banner only shows when invited
58
65
  it.skip('should find invite banner (requires invite token)', () => {
59
66
  cy.get(auth.selectors.loginInviteBanner).should('exist')
60
67
  })
61
68
  })
62
69
 
63
- describe('Login Page Selectors - Email Form', () => {
70
+ // ============================================
71
+ // SEL_AUTH_002: LOGIN FORM INPUTS
72
+ // ============================================
73
+ describe('SEL_AUTH_002: Login Form Inputs', { tags: '@SEL_AUTH_002' }, () => {
64
74
  beforeEach(() => {
65
75
  auth.visitLogin()
66
- // Wait for card and click show email to reveal form
67
76
  cy.get(auth.selectors.loginCard, { timeout: 10000 }).should('be.visible')
68
77
  cy.get(auth.selectors.loginShowEmail).click()
69
78
  cy.get(auth.selectors.loginForm, { timeout: 5000 }).should('be.visible')
@@ -101,7 +110,6 @@ describe('Auth Selectors Validation', { tags: ['@ui-selectors'] }, () => {
101
110
  cy.get(auth.selectors.loginRememberCheckbox).should('exist')
102
111
  })
103
112
 
104
- // Note: Error selectors only appear when there's an error
105
113
  it('should find email error when validation fails', () => {
106
114
  cy.get(auth.selectors.loginSubmit).click()
107
115
  cy.get(auth.selectors.loginEmailError).should('exist')
@@ -122,9 +130,9 @@ describe('Auth Selectors Validation', { tags: ['@ui-selectors'] }, () => {
122
130
  })
123
131
 
124
132
  // ============================================
125
- // SIGNUP PAGE SELECTORS (11 selectors)
133
+ // SEL_AUTH_003: SIGNUP FORM
126
134
  // ============================================
127
- describe('Signup Page Selectors', () => {
135
+ describe('SEL_AUTH_003: Signup Form', { tags: '@SEL_AUTH_003' }, () => {
128
136
  beforeEach(() => {
129
137
  auth.visitSignup()
130
138
  auth.waitForSignupForm()
@@ -158,8 +166,7 @@ describe('Auth Selectors Validation', { tags: ['@ui-selectors'] }, () => {
158
166
  cy.get(auth.selectors.signupSubmit).should('exist')
159
167
  })
160
168
 
161
- // Note: Google signup button not implemented in current SignupForm
162
- it.skip('should find Google signup button (not implemented)', () => {
169
+ it('should find Google signup button', () => {
163
170
  cy.get(auth.selectors.signupGoogle).should('exist')
164
171
  })
165
172
 
@@ -167,21 +174,28 @@ describe('Auth Selectors Validation', { tags: ['@ui-selectors'] }, () => {
167
174
  cy.get(auth.selectors.signupLoginLink).should('exist')
168
175
  })
169
176
 
170
- // Note: Invite banner only shows when invited
171
177
  it.skip('should find invite banner (requires invite token)', () => {
172
178
  cy.get(auth.selectors.signupInviteBanner).should('exist')
173
179
  })
174
180
 
175
- // Note: Error message selector not implemented in current SignupForm
176
- it.skip('should find error message (selector not implemented)', () => {
177
- cy.get(auth.selectors.signupError).should('exist')
181
+ it('should find error message when email already exists', () => {
182
+ const existingEmail = Cypress.env('DEVELOPER_EMAIL') || 'developer@nextspark.dev'
183
+
184
+ cy.get(auth.selectors.signupFirstName).type('Test')
185
+ cy.get(auth.selectors.signupLastName).type('User')
186
+ cy.get(auth.selectors.signupEmail).type(existingEmail)
187
+ cy.get(auth.selectors.signupPassword).type('Test1234!')
188
+ cy.get(auth.selectors.signupConfirmPassword).type('Test1234!')
189
+ cy.get('[data-cy="signup-terms-checkbox"]').click()
190
+ cy.get(auth.selectors.signupSubmit).click()
191
+ cy.get(auth.selectors.signupError, { timeout: 10000 }).should('exist')
178
192
  })
179
193
  })
180
194
 
181
195
  // ============================================
182
- // FORGOT PASSWORD SELECTORS (8 selectors)
196
+ // SEL_AUTH_004: FORGOT PASSWORD
183
197
  // ============================================
184
- describe('Forgot Password Selectors', () => {
198
+ describe('SEL_AUTH_004: Forgot Password', { tags: '@SEL_AUTH_004' }, () => {
185
199
  beforeEach(() => {
186
200
  auth.visitForgotPassword()
187
201
  cy.get(auth.selectors.forgotPasswordForm, { timeout: 10000 }).should('be.visible')
@@ -203,34 +217,29 @@ describe('Auth Selectors Validation', { tags: ['@ui-selectors'] }, () => {
203
217
  cy.get(auth.selectors.forgotPasswordBack).should('exist')
204
218
  })
205
219
 
206
- // Note: Success message only appears after successful submission
207
220
  it.skip('should find success message (requires successful submission)', () => {
208
221
  cy.get(auth.selectors.forgotPasswordSuccess).should('exist')
209
222
  })
210
223
 
211
- // Note: Success back link only appears in success state
212
224
  it.skip('should find success back link (requires success state)', () => {
213
225
  cy.get(auth.selectors.forgotPasswordSuccessBack).should('exist')
214
226
  })
215
227
 
216
- // Note: Retry button only appears in success state
217
228
  it.skip('should find retry button (requires success state)', () => {
218
229
  cy.get(auth.selectors.forgotPasswordRetry).should('exist')
219
230
  })
220
231
 
221
- // Note: Error only appears on server error response
222
232
  it.skip('should find error message (requires server error)', () => {
223
233
  cy.get(auth.selectors.forgotPasswordError).should('exist')
224
234
  })
225
235
  })
226
236
 
227
237
  // ============================================
228
- // DEV KEYRING SELECTORS (4 selectors)
238
+ // SEL_AUTH_005: DEVKEYRING
229
239
  // ============================================
230
- describe('DevKeyring Selectors', () => {
240
+ describe('SEL_AUTH_005: DevKeyring', { tags: '@SEL_AUTH_005' }, () => {
231
241
  beforeEach(() => {
232
242
  auth.visitLogin()
233
- // Wait for login card (not form - form may not be visible by default)
234
243
  cy.get(auth.selectors.loginCard, { timeout: 10000 }).should('be.visible')
235
244
  })
236
245
 
@@ -249,19 +258,15 @@ describe('Auth Selectors Validation', { tags: ['@ui-selectors'] }, () => {
249
258
 
250
259
  it('should find devkeyring user options', () => {
251
260
  auth.openDevKeyring()
252
- // Test first user option (index 0)
253
261
  cy.get(auth.selectors.devKeyringUser(0)).should('exist')
254
262
  })
255
263
  })
256
264
 
257
265
  // ============================================
258
- // RESET PASSWORD SELECTORS (5 selectors) - SKIP
259
- // Requires valid token from email
266
+ // SEL_AUTH_006: RESET PASSWORD (skipped - requires token)
260
267
  // ============================================
261
- describe('Reset Password Selectors', () => {
268
+ describe('SEL_AUTH_006: Reset Password', { tags: '@SEL_AUTH_006' }, () => {
262
269
  it.skip('should find reset password form (requires valid token)', () => {
263
- // These tests are skipped because they require a valid reset token
264
- // To test: auth.visitResetPassword('valid-token')
265
270
  cy.get(auth.selectors.resetPasswordForm).should('exist')
266
271
  })
267
272
 
@@ -283,10 +288,9 @@ describe('Auth Selectors Validation', { tags: ['@ui-selectors'] }, () => {
283
288
  })
284
289
 
285
290
  // ============================================
286
- // VERIFY EMAIL SELECTORS (4 selectors) - SKIP
287
- // Requires pending verification state
291
+ // SEL_AUTH_007: VERIFY EMAIL (skipped - requires state)
288
292
  // ============================================
289
- describe('Verify Email Selectors', () => {
293
+ describe('SEL_AUTH_007: Verify Email', { tags: '@SEL_AUTH_007' }, () => {
290
294
  it.skip('should find verify email container (requires pending verification)', () => {
291
295
  cy.get(auth.selectors.verifyEmailContainer).should('exist')
292
296
  })