@nextsparkjs/theme-default 0.1.0-beta.20 → 0.1.0-beta.21
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.
- package/package.json +1 -1
- package/tests/cypress/e2e/_devtools/access.bdd.md +262 -0
- package/tests/cypress/e2e/_devtools/access.cy.ts +171 -0
- package/tests/cypress/e2e/_devtools/navigation.bdd.md +261 -0
- package/tests/cypress/e2e/_devtools/navigation.cy.ts +157 -0
- package/tests/cypress/e2e/_devtools/pages.bdd.md +303 -0
- package/tests/cypress/e2e/_devtools/pages.cy.ts +184 -0
- package/tests/cypress/e2e/_docs/README.md +215 -0
- package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin-teams.narration.json +155 -0
- package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin.cy.ts +390 -0
- package/tests/cypress/e2e/_docs/tutorials/teams-system.doc.cy.ts +349 -0
- package/tests/cypress/e2e/_docs/tutorials/teams-system.narration.json +165 -0
- package/tests/cypress/e2e/_selectors/auth.cy.ts +306 -0
- package/tests/cypress/e2e/_selectors/billing.cy.ts +89 -0
- package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +113 -0
- package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +89 -0
- package/tests/cypress/e2e/_selectors/dashboard-sidebar.cy.ts +60 -0
- package/tests/cypress/e2e/_selectors/dashboard-topnav.cy.ts +146 -0
- package/tests/cypress/e2e/_selectors/devtools.cy.ts +210 -0
- package/tests/cypress/e2e/_selectors/global-search.cy.ts +88 -0
- package/tests/cypress/e2e/_selectors/pages-editor.cy.ts +179 -0
- package/tests/cypress/e2e/_selectors/posts-editor.cy.ts +282 -0
- package/tests/cypress/e2e/_selectors/public.cy.ts +112 -0
- package/tests/cypress/e2e/_selectors/settings-api-keys.cy.ts +228 -0
- package/tests/cypress/e2e/_selectors/settings-billing.cy.ts +105 -0
- package/tests/cypress/e2e/_selectors/settings-layout.cy.ts +119 -0
- package/tests/cypress/e2e/_selectors/settings-password.cy.ts +71 -0
- package/tests/cypress/e2e/_selectors/settings-profile.cy.ts +82 -0
- package/tests/cypress/e2e/_selectors/settings-teams.cy.ts +68 -0
- package/tests/cypress/e2e/_selectors/superadmin.cy.ts +185 -0
- package/tests/cypress/e2e/_selectors/tasks.cy.ts +242 -0
- package/tests/cypress/e2e/_selectors/taxonomies.cy.ts +126 -0
- package/tests/cypress/e2e/_selectors/teams.cy.ts +142 -0
- package/tests/cypress/e2e/_superadmin/all-teams.bdd.md +261 -0
- package/tests/cypress/e2e/_superadmin/all-teams.cy.ts +177 -0
- package/tests/cypress/e2e/_superadmin/all-users.bdd.md +406 -0
- package/tests/cypress/e2e/_superadmin/all-users.cy.ts +294 -0
- package/tests/cypress/e2e/_superadmin/dashboard.bdd.md +235 -0
- package/tests/cypress/e2e/_superadmin/dashboard.cy.ts +149 -0
- package/tests/cypress/e2e/_superadmin/subscriptions-overview.bdd.md +290 -0
- package/tests/cypress/e2e/_superadmin/subscriptions-overview.cy.ts +194 -0
- package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
- package/tests/cypress/e2e/ai/chat-api.cy.ts +107 -0
- package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
- package/tests/cypress/e2e/api/billing/BillingAPIController.js +319 -0
- package/tests/cypress/e2e/api/billing/check-action.cy.ts +326 -0
- package/tests/cypress/e2e/api/billing/checkout.cy.ts +358 -0
- package/tests/cypress/e2e/api/billing/lifecycle.cy.ts +423 -0
- package/tests/cypress/e2e/api/billing/plans/README.md +345 -0
- package/tests/cypress/e2e/api/billing/plans/business.cy.ts +412 -0
- package/tests/cypress/e2e/api/billing/plans/downgrade.cy.ts +510 -0
- package/tests/cypress/e2e/api/billing/plans/fixtures/billing-plans.json +163 -0
- package/tests/cypress/e2e/api/billing/plans/free.cy.ts +500 -0
- package/tests/cypress/e2e/api/billing/plans/pro.cy.ts +497 -0
- package/tests/cypress/e2e/api/billing/plans/starter.cy.ts +342 -0
- package/tests/cypress/e2e/api/billing/portal.cy.ts +313 -0
- package/tests/cypress/e2e/api/devtools/registries.bdd.md +300 -0
- package/tests/cypress/e2e/api/devtools/registries.cy.ts +368 -0
- package/tests/cypress/e2e/api/entities/blocks-scope.cy.ts +396 -0
- package/tests/cypress/e2e/api/entities/customers-crud.cy.ts +648 -0
- package/tests/cypress/e2e/api/entities/customers-metas.cy.ts +839 -0
- package/tests/cypress/e2e/api/entities/pages-crud.cy.ts +425 -0
- package/tests/cypress/e2e/api/entities/pages-status.cy.ts +335 -0
- package/tests/cypress/e2e/api/entities/post-categories-crud.cy.ts +610 -0
- package/tests/cypress/e2e/api/entities/posts-crud.cy.ts +709 -0
- package/tests/cypress/e2e/api/entities/posts-status.cy.ts +396 -0
- package/tests/cypress/e2e/api/entities/tasks-crud.cy.ts +602 -0
- package/tests/cypress/e2e/api/entities/tasks-metas.cy.ts +878 -0
- package/tests/cypress/e2e/api/entities/users-crud.cy.ts +469 -0
- package/tests/cypress/e2e/api/entities/users-metas.cy.ts +913 -0
- package/tests/cypress/e2e/api/entities/users-security.cy.ts +375 -0
- package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.bdd.md +375 -0
- package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.cy.ts +346 -0
- package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.bdd.md +451 -0
- package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.cy.ts +447 -0
- package/tests/cypress/e2e/api/scheduled-actions/scheduling.bdd.md +649 -0
- package/tests/cypress/e2e/api/scheduled-actions/scheduling.cy.ts +333 -0
- package/tests/cypress/e2e/api/settings/api-keys.crud.cy.ts +923 -0
- package/tests/cypress/e2e/uat/auth/app-roles/developer-login.bdd.md +231 -0
- package/tests/cypress/e2e/uat/auth/app-roles/developer-login.cy.ts +144 -0
- package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.bdd.md +118 -0
- package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.cy.ts +84 -0
- package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.bdd.md +288 -0
- package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.cy.ts +188 -0
- package/tests/cypress/e2e/uat/auth/login-logout.bdd.md +160 -0
- package/tests/cypress/e2e/uat/auth/login-logout.cy.ts +116 -0
- package/tests/cypress/e2e/uat/auth/password-reset.bdd.md +289 -0
- package/tests/cypress/e2e/uat/auth/password-reset.cy.ts +200 -0
- package/tests/cypress/e2e/uat/auth/team-roles/admin-login.bdd.md +225 -0
- package/tests/cypress/e2e/uat/auth/team-roles/admin-login.cy.ts +148 -0
- package/tests/cypress/e2e/uat/auth/team-roles/member-login.bdd.md +251 -0
- package/tests/cypress/e2e/uat/auth/team-roles/member-login.cy.ts +163 -0
- package/tests/cypress/e2e/uat/auth/team-roles/owner-login.bdd.md +231 -0
- package/tests/cypress/e2e/uat/auth/team-roles/owner-login.cy.ts +141 -0
- package/tests/cypress/e2e/uat/billing/extended.bdd.md +273 -0
- package/tests/cypress/e2e/uat/billing/extended.cy.ts +209 -0
- package/tests/cypress/e2e/uat/billing/feature-gates.bdd.md +407 -0
- package/tests/cypress/e2e/uat/billing/feature-gates.cy.ts +307 -0
- package/tests/cypress/e2e/uat/billing/page.bdd.md +329 -0
- package/tests/cypress/e2e/uat/billing/page.cy.ts +250 -0
- package/tests/cypress/e2e/uat/billing/status.bdd.md +190 -0
- package/tests/cypress/e2e/uat/billing/status.cy.ts +145 -0
- package/tests/cypress/e2e/uat/billing/team-switch.bdd.md +156 -0
- package/tests/cypress/e2e/uat/billing/team-switch.cy.ts +122 -0
- package/tests/cypress/e2e/uat/billing/usage.bdd.md +218 -0
- package/tests/cypress/e2e/uat/billing/usage.cy.ts +176 -0
- package/tests/cypress/e2e/uat/blocks/hero.bdd.md +124 -0
- package/tests/cypress/e2e/uat/blocks/hero.cy.ts +56 -0
- package/tests/cypress/e2e/uat/devtools/api-tester.cy.ts +390 -0
- package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
- package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
- package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
- package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
- package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
- package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
- package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
- package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
- package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
- package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
- package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
- package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
- package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
- package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
- package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
- package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
- package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
- package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
- package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
- package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
- package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
- package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
- package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
- package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
- package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
- package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
- package/tests/cypress/e2e/uat/roles/editor-role.bdd.md +552 -0
- package/tests/cypress/e2e/uat/roles/editor-role.cy.ts +210 -0
- package/tests/cypress/e2e/uat/roles/member-restrictions.bdd.md +450 -0
- package/tests/cypress/e2e/uat/roles/member-restrictions.cy.ts +189 -0
- package/tests/cypress/e2e/uat/roles/owner-full-crud.bdd.md +530 -0
- package/tests/cypress/e2e/uat/roles/owner-full-crud.cy.ts +247 -0
- package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.bdd.md +736 -0
- package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.cy.ts +740 -0
- package/tests/cypress/e2e/uat/teams/roles-matrix.bdd.md +553 -0
- package/tests/cypress/e2e/uat/teams/roles-matrix.cy.ts +185 -0
- package/tests/cypress/e2e/uat/teams/switcher.bdd.md +1151 -0
- package/tests/cypress/e2e/uat/teams/switcher.cy.ts +497 -0
- package/tests/cypress/e2e/uat/teams/team-switcher.md +198 -0
- package/tests/cypress/fixtures/blocks.json +218 -0
- package/tests/cypress/fixtures/entities.json +78 -0
- package/tests/cypress/fixtures/page-builder.json +21 -0
- package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
- package/tests/cypress/src/components/CustomersPOM.ts +439 -0
- package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
- package/tests/cypress/src/components/EntityForm.ts +375 -0
- package/tests/cypress/src/components/EntityList.ts +389 -0
- package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
- package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
- package/tests/cypress/src/components/PostsListPOM.ts +223 -0
- package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
- package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
- package/tests/cypress/src/components/TasksPOM.ts +272 -0
- package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
- package/tests/cypress/src/components/index.ts +21 -0
- package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
- package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
- package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
- package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
- package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
- package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
- package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
- package/tests/cypress/src/controllers/index.js +25 -0
- package/tests/cypress/src/core/AuthPOM.ts +450 -0
- package/tests/cypress/src/core/BasePOM.ts +86 -0
- package/tests/cypress/src/core/BlockEditorBasePOM.ts +576 -0
- package/tests/cypress/src/core/DashboardEntityPOM.ts +692 -0
- package/tests/cypress/src/core/index.ts +14 -0
- package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
- package/tests/cypress/src/entities/PagesPOM.ts +137 -0
- package/tests/cypress/src/entities/PostsPOM.ts +137 -0
- package/tests/cypress/src/entities/TasksPOM.ts +176 -0
- package/tests/cypress/src/entities/index.ts +14 -0
- package/tests/cypress/src/features/BillingPOM.ts +385 -0
- package/tests/cypress/src/features/DashboardPOM.ts +245 -0
- package/tests/cypress/src/features/DevtoolsPOM.ts +739 -0
- package/tests/cypress/src/features/PageBuilderPOM.ts +263 -0
- package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
- package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
- package/tests/cypress/src/features/SettingsPOM.ts +362 -0
- package/tests/cypress/src/features/SuperadminPOM.ts +331 -0
- package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
- package/tests/cypress/src/features/index.ts +28 -0
- package/tests/cypress/src/helpers/ApiInterceptor.ts +177 -0
- package/tests/cypress/src/index.ts +101 -0
- package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
- package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
- package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
- package/tests/cypress/src/pages/dashboard/index.js +6 -0
- package/tests/cypress/src/pages/index.js +5 -0
- package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
- package/tests/cypress/src/pages/public/LandingPage.js +69 -0
- package/tests/cypress/src/pages/public/PricingPage.js +33 -0
- package/tests/cypress/src/pages/public/index.js +6 -0
- package/tests/cypress/src/selectors.ts +46 -0
- package/tests/cypress/src/session-helpers.ts +500 -0
- package/tests/cypress/support/doc-commands.ts +260 -0
- package/tests/cypress.config.ts +150 -0
- package/tests/jest/components/post-header.test.tsx +377 -0
- package/tests/jest/config/role-config.test.ts +529 -0
- package/tests/jest/jest.config.ts +81 -0
- package/tests/jest/langchain/COVERAGE.md +372 -0
- package/tests/jest/langchain/guardrails.test.ts +465 -0
- package/tests/jest/langchain/streaming.test.ts +367 -0
- package/tests/jest/langchain/token-tracker.test.ts +455 -0
- package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
- package/tests/jest/langchain/tracer.test.ts +823 -0
- package/tests/jest/user-roles/role-helpers.test.ts +432 -0
- package/tests/jest/validation/categories.test.ts +429 -0
- package/tests/jest/validation/posts.test.ts +546 -0
- package/tests/tsconfig.json +15 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
---
|
|
2
|
+
feature: Developer App Role Authentication
|
|
3
|
+
priority: critical
|
|
4
|
+
tags: [auth, app-role, developer, dev-zone, security]
|
|
5
|
+
grepTags: [uat, feat-auth, app-role, developer]
|
|
6
|
+
coverage: 6
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Developer App Role Authentication
|
|
10
|
+
|
|
11
|
+
> Tests for Developer app role login and specific access privileges. Developer is a global app role (not team-based) that grants access to the Dev Zone and inherits Sector7 access.
|
|
12
|
+
|
|
13
|
+
## @test DEV-LOGIN-001: Developer Login and Dev Zone Access
|
|
14
|
+
|
|
15
|
+
### Metadata
|
|
16
|
+
- **Priority:** Critical
|
|
17
|
+
- **Type:** Smoke
|
|
18
|
+
- **Tags:** developer, login, dev-zone
|
|
19
|
+
- **Grep:** `@smoke`
|
|
20
|
+
|
|
21
|
+
```gherkin:en
|
|
22
|
+
Scenario: Developer can login and access Dev Zone
|
|
23
|
+
|
|
24
|
+
Given I am logged in as Developer (developer@nextspark.dev)
|
|
25
|
+
When I visit /dev
|
|
26
|
+
Then the URL should include /dev
|
|
27
|
+
And the Dev Zone home page should be visible
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```gherkin:es
|
|
31
|
+
Scenario: Developer puede loguearse y acceder a Dev Zone
|
|
32
|
+
|
|
33
|
+
Given estoy logueado como Developer (developer@nextspark.dev)
|
|
34
|
+
When visito /dev
|
|
35
|
+
Then la URL deberia incluir /dev
|
|
36
|
+
And la pagina principal de Dev Zone deberia estar visible
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Expected Results
|
|
40
|
+
- Developer successfully logs in
|
|
41
|
+
- Access to /dev is granted
|
|
42
|
+
- Dev Zone home page renders correctly
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## @test DEV-LOGIN-002: Developer Access to Style Gallery
|
|
47
|
+
|
|
48
|
+
### Metadata
|
|
49
|
+
- **Priority:** Normal
|
|
50
|
+
- **Type:** Smoke
|
|
51
|
+
- **Tags:** developer, style-gallery
|
|
52
|
+
- **Grep:** `@smoke`
|
|
53
|
+
|
|
54
|
+
```gherkin:en
|
|
55
|
+
Scenario: Developer can access Style Gallery
|
|
56
|
+
|
|
57
|
+
Given I am logged in as Developer (developer@nextspark.dev)
|
|
58
|
+
When I visit /dev/style
|
|
59
|
+
Then the URL should include /dev/style
|
|
60
|
+
And the Style Gallery page should be visible
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
```gherkin:es
|
|
64
|
+
Scenario: Developer puede acceder a Style Gallery
|
|
65
|
+
|
|
66
|
+
Given estoy logueado como Developer (developer@nextspark.dev)
|
|
67
|
+
When visito /dev/style
|
|
68
|
+
Then la URL deberia incluir /dev/style
|
|
69
|
+
And la pagina de Style Gallery deberia estar visible
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Expected Results
|
|
73
|
+
- Style Gallery page loads successfully
|
|
74
|
+
- All component sections available
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## @test DEV-LOGIN-003: Developer Access to Test Cases
|
|
79
|
+
|
|
80
|
+
### Metadata
|
|
81
|
+
- **Priority:** Normal
|
|
82
|
+
- **Type:** Smoke
|
|
83
|
+
- **Tags:** developer, test-cases
|
|
84
|
+
- **Grep:** `@smoke`
|
|
85
|
+
|
|
86
|
+
```gherkin:en
|
|
87
|
+
Scenario: Developer can access Test Cases viewer
|
|
88
|
+
|
|
89
|
+
Given I am logged in as Developer (developer@nextspark.dev)
|
|
90
|
+
When I visit /dev/tests
|
|
91
|
+
Then the URL should include /dev/tests
|
|
92
|
+
And the Test Cases viewer should be visible
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
```gherkin:es
|
|
96
|
+
Scenario: Developer puede acceder al visor de Test Cases
|
|
97
|
+
|
|
98
|
+
Given estoy logueado como Developer (developer@nextspark.dev)
|
|
99
|
+
When visito /dev/tests
|
|
100
|
+
Then la URL deberia incluir /dev/tests
|
|
101
|
+
And el visor de Test Cases deberia estar visible
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Expected Results
|
|
105
|
+
- Test Cases viewer loads successfully
|
|
106
|
+
- File tree or empty state visible
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## @test DEV-LOGIN-004: Developer Access to Config Viewer
|
|
111
|
+
|
|
112
|
+
### Metadata
|
|
113
|
+
- **Priority:** Normal
|
|
114
|
+
- **Type:** Smoke
|
|
115
|
+
- **Tags:** developer, config-viewer
|
|
116
|
+
- **Grep:** `@smoke`
|
|
117
|
+
|
|
118
|
+
```gherkin:en
|
|
119
|
+
Scenario: Developer can access Config Viewer
|
|
120
|
+
|
|
121
|
+
Given I am logged in as Developer (developer@nextspark.dev)
|
|
122
|
+
When I visit /dev/config
|
|
123
|
+
Then the URL should include /dev/config
|
|
124
|
+
And the Config Viewer page should be visible
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
```gherkin:es
|
|
128
|
+
Scenario: Developer puede acceder a Config Viewer
|
|
129
|
+
|
|
130
|
+
Given estoy logueado como Developer (developer@nextspark.dev)
|
|
131
|
+
When visito /dev/config
|
|
132
|
+
Then la URL deberia incluir /dev/config
|
|
133
|
+
And la pagina de Config Viewer deberia estar visible
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Expected Results
|
|
137
|
+
- Config Viewer loads successfully
|
|
138
|
+
- Theme and Entities tabs available
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## @test DEV-LOGIN-005: Developer Inherited Sector7 Access
|
|
143
|
+
|
|
144
|
+
### Metadata
|
|
145
|
+
- **Priority:** High
|
|
146
|
+
- **Type:** Regression
|
|
147
|
+
- **Tags:** developer, sector7, inherited
|
|
148
|
+
|
|
149
|
+
```gherkin:en
|
|
150
|
+
Scenario: Developer can access Sector7 (inherited privilege)
|
|
151
|
+
|
|
152
|
+
Given I am logged in as Developer (developer@nextspark.dev)
|
|
153
|
+
When I visit /sector7
|
|
154
|
+
Then the URL should include /sector7
|
|
155
|
+
And the Sector7 container should be visible
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
```gherkin:es
|
|
159
|
+
Scenario: Developer puede acceder a Sector7 (privilegio heredado)
|
|
160
|
+
|
|
161
|
+
Given estoy logueado como Developer (developer@nextspark.dev)
|
|
162
|
+
When visito /sector7
|
|
163
|
+
Then la URL deberia incluir /sector7
|
|
164
|
+
And el contenedor de Sector7 deberia estar visible
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Expected Results
|
|
168
|
+
- Developer inherits superadmin privileges for Sector7
|
|
169
|
+
- Sector7 control panel accessible
|
|
170
|
+
- No access denied redirect
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## @test DEV-LOGIN-006: Developer Logout Flow
|
|
175
|
+
|
|
176
|
+
### Metadata
|
|
177
|
+
- **Priority:** Normal
|
|
178
|
+
- **Type:** Regression
|
|
179
|
+
- **Tags:** developer, logout
|
|
180
|
+
|
|
181
|
+
```gherkin:en
|
|
182
|
+
Scenario: Developer can logout successfully
|
|
183
|
+
|
|
184
|
+
Given I am logged in as Developer (developer@nextspark.dev)
|
|
185
|
+
And I am on the dashboard
|
|
186
|
+
When I click on user menu
|
|
187
|
+
And I click on Sign Out
|
|
188
|
+
Then I should be redirected to /login
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
```gherkin:es
|
|
192
|
+
Scenario: Developer puede cerrar sesion correctamente
|
|
193
|
+
|
|
194
|
+
Given estoy logueado como Developer (developer@nextspark.dev)
|
|
195
|
+
And estoy en el dashboard
|
|
196
|
+
When hago click en el menu de usuario
|
|
197
|
+
And hago click en Sign Out
|
|
198
|
+
Then deberia ser redirigido a /login
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Expected Results
|
|
202
|
+
- User menu opens correctly
|
|
203
|
+
- Sign out action works
|
|
204
|
+
- Redirect to login page
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## UI Elements
|
|
209
|
+
|
|
210
|
+
| Element | Selector | Description |
|
|
211
|
+
|---------|----------|-------------|
|
|
212
|
+
| Dev Home Page | `[data-cy="dev-home-page"]` | Dev Zone home page container |
|
|
213
|
+
| Dev Style Page | `[data-cy="dev-style-page"]` | Style Gallery page container |
|
|
214
|
+
| Dev Tests Page | `[data-cy="dev-tests-page"]` | Test Cases viewer container |
|
|
215
|
+
| Dev Config Page | `[data-cy="dev-config-page"]` | Config Viewer page container |
|
|
216
|
+
| Sector7 Container | `[data-cy="sector7-container"]` | Sector7 main container |
|
|
217
|
+
| User Menu Trigger | `[data-cy="topnav-user-menu-trigger"]` | User menu dropdown trigger |
|
|
218
|
+
| Sign Out Button | `[data-cy="topnav-menu-signOut"]` | Sign out menu item |
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Summary
|
|
223
|
+
|
|
224
|
+
| Test ID | Block | Description | Tags |
|
|
225
|
+
|---------|-------|-------------|------|
|
|
226
|
+
| DEV-LOGIN-001 | Login | Developer login + Dev Zone access | `@smoke` |
|
|
227
|
+
| DEV-LOGIN-002 | Access | Style Gallery access | `@smoke` |
|
|
228
|
+
| DEV-LOGIN-003 | Access | Test Cases viewer access | `@smoke` |
|
|
229
|
+
| DEV-LOGIN-004 | Access | Config Viewer access | `@smoke` |
|
|
230
|
+
| DEV-LOGIN-005 | Inherited | Sector7 access (inherited) | |
|
|
231
|
+
| DEV-LOGIN-006 | Logout | Developer logout flow | |
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/// <reference types="cypress" />
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Developer App Role Login Tests
|
|
5
|
+
*
|
|
6
|
+
* Tests the Developer app role login and specific access:
|
|
7
|
+
* - Login as developer@nextspark.dev
|
|
8
|
+
* - Access to /dev zone
|
|
9
|
+
* - Access to /superadmin (inherited)
|
|
10
|
+
* - No team context required (global role)
|
|
11
|
+
*
|
|
12
|
+
* Tags: @uat, @feat-auth, @app-role, @developer
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import * as allure from 'allure-cypress'
|
|
16
|
+
|
|
17
|
+
import { loginAsDefaultDeveloper, CORE_USERS } from '../../../../src/session-helpers'
|
|
18
|
+
|
|
19
|
+
describe('Authentication - Developer App Role', {
|
|
20
|
+
tags: ['@uat', '@feat-auth', '@app-role', '@developer']
|
|
21
|
+
}, () => {
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
allure.epic('Authentication')
|
|
24
|
+
allure.feature('App Roles')
|
|
25
|
+
allure.story('Developer Login')
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
describe('DEV-LOGIN-001: Developer Login and Dev Zone Access', { tags: '@smoke' }, () => {
|
|
29
|
+
it('should login as developer and access /dev zone', { tags: '@smoke' }, () => {
|
|
30
|
+
allure.severity('critical')
|
|
31
|
+
|
|
32
|
+
// 1. Login as Developer
|
|
33
|
+
loginAsDefaultDeveloper()
|
|
34
|
+
|
|
35
|
+
// 2. Visit Dev Zone
|
|
36
|
+
cy.visit('/dev', { timeout: 60000 })
|
|
37
|
+
|
|
38
|
+
// 3. Validate access to Dev Zone
|
|
39
|
+
cy.url().should('include', '/dev')
|
|
40
|
+
cy.get('[data-cy="dev-home-page"]').should('be.visible')
|
|
41
|
+
|
|
42
|
+
cy.log(`✅ Developer login successful (${CORE_USERS.DEVELOPER})`)
|
|
43
|
+
cy.log('✅ Dev Zone access granted')
|
|
44
|
+
})
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
describe('DEV-LOGIN-002: Developer Access to Style Gallery', { tags: '@smoke' }, () => {
|
|
48
|
+
it('should access /dev/style page', { tags: '@smoke' }, () => {
|
|
49
|
+
allure.severity('normal')
|
|
50
|
+
|
|
51
|
+
// 1. Login as Developer
|
|
52
|
+
loginAsDefaultDeveloper()
|
|
53
|
+
|
|
54
|
+
// 2. Visit Style Gallery
|
|
55
|
+
cy.visit('/dev/style', { timeout: 60000 })
|
|
56
|
+
|
|
57
|
+
// 3. Validate access
|
|
58
|
+
cy.url().should('include', '/dev/style')
|
|
59
|
+
cy.get('[data-cy="dev-style-page"]').should('be.visible')
|
|
60
|
+
|
|
61
|
+
cy.log('✅ Style Gallery access granted')
|
|
62
|
+
})
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
describe('DEV-LOGIN-003: Developer Access to Test Cases', { tags: '@smoke' }, () => {
|
|
66
|
+
it('should access /dev/tests page', { tags: '@smoke' }, () => {
|
|
67
|
+
allure.severity('normal')
|
|
68
|
+
|
|
69
|
+
// 1. Login as Developer
|
|
70
|
+
loginAsDefaultDeveloper()
|
|
71
|
+
|
|
72
|
+
// 2. Visit Test Cases viewer
|
|
73
|
+
cy.visit('/dev/tests', { timeout: 60000 })
|
|
74
|
+
|
|
75
|
+
// 3. Validate access
|
|
76
|
+
cy.url().should('include', '/dev/tests')
|
|
77
|
+
cy.get('[data-cy="dev-tests-page"]').should('be.visible')
|
|
78
|
+
|
|
79
|
+
cy.log('✅ Test Cases viewer access granted')
|
|
80
|
+
})
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
describe('DEV-LOGIN-004: Developer Access to Config Viewer', { tags: '@smoke' }, () => {
|
|
84
|
+
it('should access /dev/config page', { tags: '@smoke' }, () => {
|
|
85
|
+
allure.severity('normal')
|
|
86
|
+
|
|
87
|
+
// 1. Login as Developer
|
|
88
|
+
loginAsDefaultDeveloper()
|
|
89
|
+
|
|
90
|
+
// 2. Visit Config Viewer
|
|
91
|
+
cy.visit('/dev/config', { timeout: 60000 })
|
|
92
|
+
|
|
93
|
+
// 3. Validate access
|
|
94
|
+
cy.url().should('include', '/dev/config')
|
|
95
|
+
cy.get('[data-cy="dev-config-page"]').should('be.visible')
|
|
96
|
+
|
|
97
|
+
cy.log('✅ Config Viewer access granted')
|
|
98
|
+
})
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
describe('DEV-LOGIN-005: Developer Inherited Superadmin Access', () => {
|
|
102
|
+
it('should have access to /superadmin (inherited from superadmin)', () => {
|
|
103
|
+
allure.severity('high')
|
|
104
|
+
|
|
105
|
+
// 1. Login as Developer
|
|
106
|
+
loginAsDefaultDeveloper()
|
|
107
|
+
|
|
108
|
+
// 2. Visit Superadmin
|
|
109
|
+
cy.visit('/superadmin', { timeout: 60000 })
|
|
110
|
+
|
|
111
|
+
// 3. Validate access to Superadmin
|
|
112
|
+
cy.url().should('include', '/superadmin')
|
|
113
|
+
cy.get('[data-cy="sector7-container"]').should('be.visible')
|
|
114
|
+
|
|
115
|
+
cy.log('✅ Superadmin access granted (inherited privilege)')
|
|
116
|
+
})
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
describe('DEV-LOGIN-006: Developer Logout Flow', () => {
|
|
120
|
+
it('should logout successfully and redirect to login', () => {
|
|
121
|
+
allure.severity('normal')
|
|
122
|
+
|
|
123
|
+
// 1. Login as Developer
|
|
124
|
+
loginAsDefaultDeveloper()
|
|
125
|
+
|
|
126
|
+
// 2. Visit dashboard
|
|
127
|
+
cy.visit('/dashboard', { timeout: 60000 })
|
|
128
|
+
cy.url().should('include', '/dashboard')
|
|
129
|
+
|
|
130
|
+
// 3. Logout via user menu
|
|
131
|
+
cy.get('[data-cy="topnav-user-menu-trigger"]').click()
|
|
132
|
+
cy.get('[data-cy="topnav-menu-signOut"]').should('be.visible').click()
|
|
133
|
+
|
|
134
|
+
// 4. Validate redirected to login
|
|
135
|
+
cy.url().should('include', '/login')
|
|
136
|
+
|
|
137
|
+
cy.log('✅ Developer logout successful')
|
|
138
|
+
})
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
after(() => {
|
|
142
|
+
cy.log('✅ Developer app role tests completed')
|
|
143
|
+
})
|
|
144
|
+
})
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
feature: SuperAdmin Authentication Flow
|
|
3
|
+
priority: critical
|
|
4
|
+
tags: [authentication, superadmin, sector7, security]
|
|
5
|
+
grepTags: [uat, feat-auth, security, regression]
|
|
6
|
+
coverage: 1
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# SuperAdmin Authentication Flow
|
|
10
|
+
|
|
11
|
+
> Complete authentication flow for SuperAdmin users including Sector7 access, user/team management navigation, and logout.
|
|
12
|
+
|
|
13
|
+
## @test SUPERADMIN_001: SuperAdmin complete login and Sector7 flow
|
|
14
|
+
|
|
15
|
+
### Metadata
|
|
16
|
+
- **Priority:** Critical
|
|
17
|
+
- **Type:** Smoke
|
|
18
|
+
- **Tags:** auth, sector7, security
|
|
19
|
+
- **Grep:** `@smoke`, `@security`
|
|
20
|
+
|
|
21
|
+
```gherkin:en
|
|
22
|
+
Scenario: SuperAdmin complete flow - login, Sector7 access, navigate tables, logout
|
|
23
|
+
|
|
24
|
+
Given I am logged in as SuperAdmin (superadmin@nextspark.dev)
|
|
25
|
+
And I am on the dashboard
|
|
26
|
+
|
|
27
|
+
# Sector7 Access
|
|
28
|
+
When I verify the Sector7 icon is visible in TopNavbar
|
|
29
|
+
And I click the Sector7 icon
|
|
30
|
+
Then the URL should include /sector7
|
|
31
|
+
And "Super Administrator Control Panel" should be visible
|
|
32
|
+
|
|
33
|
+
# Users Management
|
|
34
|
+
When I click the Users navigation link
|
|
35
|
+
Then the URL should include /sector7/users
|
|
36
|
+
And "User Management" should be visible
|
|
37
|
+
And a table should be visible
|
|
38
|
+
|
|
39
|
+
# Teams Management
|
|
40
|
+
When I click the Teams navigation link
|
|
41
|
+
Then the URL should include /sector7/teams
|
|
42
|
+
And "Team Management" should be visible
|
|
43
|
+
And a table should be visible
|
|
44
|
+
|
|
45
|
+
# Exit Sector7
|
|
46
|
+
When I click the "Exit to Dashboard" button
|
|
47
|
+
Then the URL should include /dashboard
|
|
48
|
+
And the URL should not include /sector7
|
|
49
|
+
|
|
50
|
+
# Logout
|
|
51
|
+
When I click the user menu trigger
|
|
52
|
+
And I click the Sign Out option
|
|
53
|
+
Then I should be redirected to /login
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
```gherkin:es
|
|
57
|
+
Scenario: Flujo completo SuperAdmin - login, acceso Sector7, navegar tablas, logout
|
|
58
|
+
|
|
59
|
+
Given estoy logueado como SuperAdmin (superadmin@nextspark.dev)
|
|
60
|
+
And estoy en el dashboard
|
|
61
|
+
|
|
62
|
+
# Acceso a Sector7
|
|
63
|
+
When verifico que el icono de Sector7 esta visible en TopNavbar
|
|
64
|
+
And hago clic en el icono de Sector7
|
|
65
|
+
Then la URL deberia incluir /sector7
|
|
66
|
+
And "Super Administrator Control Panel" deberia estar visible
|
|
67
|
+
|
|
68
|
+
# Gestion de Usuarios
|
|
69
|
+
When hago clic en el enlace de navegacion Users
|
|
70
|
+
Then la URL deberia incluir /sector7/users
|
|
71
|
+
And "User Management" deberia estar visible
|
|
72
|
+
And una tabla deberia estar visible
|
|
73
|
+
|
|
74
|
+
# Gestion de Equipos
|
|
75
|
+
When hago clic en el enlace de navegacion Teams
|
|
76
|
+
Then la URL deberia incluir /sector7/teams
|
|
77
|
+
And "Team Management" deberia estar visible
|
|
78
|
+
And una tabla deberia estar visible
|
|
79
|
+
|
|
80
|
+
# Salir de Sector7
|
|
81
|
+
When hago clic en el boton "Exit to Dashboard"
|
|
82
|
+
Then la URL deberia incluir /dashboard
|
|
83
|
+
And la URL no deberia incluir /sector7
|
|
84
|
+
|
|
85
|
+
# Cerrar Sesion
|
|
86
|
+
When hago clic en el trigger del menu de usuario
|
|
87
|
+
And hago clic en la opcion Sign Out
|
|
88
|
+
Then deberia ser redirigido a /login
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Expected Results
|
|
92
|
+
- SuperAdmin can access dashboard after login
|
|
93
|
+
- Sector7 icon visible in TopNavbar (superadmin only)
|
|
94
|
+
- Sector7 control panel accessible
|
|
95
|
+
- Users and Teams management tables visible
|
|
96
|
+
- Exit to dashboard works correctly
|
|
97
|
+
- Logout redirects to login page
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## UI Elements
|
|
102
|
+
|
|
103
|
+
| Element | Selector | Description |
|
|
104
|
+
|---------|----------|-------------|
|
|
105
|
+
| Sector7 Icon | `[data-cy="topnav-sector7"]` | Sector7 access (SuperAdmin/Developer only) |
|
|
106
|
+
| Users Nav | `[data-cy="sector7-nav-users"]` | Navigate to Users management |
|
|
107
|
+
| Teams Nav | `[data-cy="sector7-nav-teams"]` | Navigate to Teams management |
|
|
108
|
+
| Exit Button | `[data-cy="sector7-sidebar-exit-to-dashboard"]` | Exit Sector7 to dashboard |
|
|
109
|
+
| User Menu | `[data-cy="topnav-user-menu-trigger"]` | User dropdown menu trigger |
|
|
110
|
+
| Sign Out | `[data-cy="topnav-menu-signOut"]` | Logout option |
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Summary
|
|
115
|
+
|
|
116
|
+
| Test ID | Block | Description | Tags |
|
|
117
|
+
|---------|-------|-------------|------|
|
|
118
|
+
| SUPERADMIN_001 | Complete Flow | Login, Sector7 access, Users/Teams navigation, Logout | `@smoke`, `@security`, `@critical` |
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/// <reference types="cypress" />
|
|
2
|
+
|
|
3
|
+
import * as allure from 'allure-cypress'
|
|
4
|
+
|
|
5
|
+
import { loginAsDefaultSuperadmin, CORE_USERS } from '../../../../src/session-helpers'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* SuperAdmin Login Test
|
|
9
|
+
*
|
|
10
|
+
* Tests the complete SuperAdmin flow:
|
|
11
|
+
* 1. Login via API (using session helper)
|
|
12
|
+
* 2. Access Superadmin panel
|
|
13
|
+
* 3. Navigate through Users and Teams management
|
|
14
|
+
* 4. Logout
|
|
15
|
+
*
|
|
16
|
+
* Uses: loginAsDefaultSuperadmin() from session-helpers
|
|
17
|
+
* User: superadmin@nextspark.dev (core system user with global superadmin role)
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
describe('Authentication - SuperAdmin Flow', {
|
|
21
|
+
tags: ['@uat', '@feat-auth', '@security', '@regression']
|
|
22
|
+
}, () => {
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
allure.epic('UAT')
|
|
25
|
+
allure.feature('Authentication')
|
|
26
|
+
allure.story('SuperAdmin Access')
|
|
27
|
+
loginAsDefaultSuperadmin()
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
describe('SUPERADMIN_001: SuperAdmin Login and Panel Access', () => {
|
|
31
|
+
it('should login as superadmin, access panel, view tables, and logout', () => {
|
|
32
|
+
allure.severity('critical')
|
|
33
|
+
|
|
34
|
+
// 1. Visit dashboard (session already established)
|
|
35
|
+
cy.visit('/dashboard', { timeout: 60000 })
|
|
36
|
+
cy.url().should('include', '/dashboard')
|
|
37
|
+
cy.log(`✅ SuperAdmin login successful (${CORE_USERS.SUPERADMIN})`)
|
|
38
|
+
|
|
39
|
+
// 2. Validate Superadmin icon is visible (superadmin only)
|
|
40
|
+
cy.get('[data-cy="topnav-superadmin"]').should('be.visible')
|
|
41
|
+
cy.log('✅ Superadmin icon visible in TopNavbar')
|
|
42
|
+
|
|
43
|
+
// 3. Navigate to Superadmin panel
|
|
44
|
+
cy.get('[data-cy="topnav-superadmin"]').click()
|
|
45
|
+
cy.url().should('include', '/superadmin')
|
|
46
|
+
cy.contains('Super Administrator Control Panel').should('be.visible')
|
|
47
|
+
cy.log('✅ Navigated to Superadmin dashboard')
|
|
48
|
+
|
|
49
|
+
// 4. Navigate to Users table and validate
|
|
50
|
+
cy.get('[data-cy="superadmin-nav-users"]').click()
|
|
51
|
+
cy.url().should('include', '/superadmin/users')
|
|
52
|
+
cy.contains('User Management').should('be.visible')
|
|
53
|
+
cy.get('table').should('be.visible')
|
|
54
|
+
cy.log('✅ Users table loaded and visible')
|
|
55
|
+
|
|
56
|
+
// 5. Navigate to Teams table and validate
|
|
57
|
+
cy.get('[data-cy="superadmin-nav-teams"]').click()
|
|
58
|
+
cy.url().should('include', '/superadmin/teams')
|
|
59
|
+
cy.contains('Team Management').should('be.visible')
|
|
60
|
+
cy.get('table').should('be.visible')
|
|
61
|
+
cy.log('✅ Teams table loaded and visible')
|
|
62
|
+
|
|
63
|
+
// 6. Exit Superadmin back to dashboard
|
|
64
|
+
cy.get('[data-cy="superadmin-sidebar-exit-to-dashboard"]').click()
|
|
65
|
+
cy.url().should('include', '/dashboard')
|
|
66
|
+
cy.url().should('not.include', '/superadmin')
|
|
67
|
+
cy.log('✅ Exited Superadmin')
|
|
68
|
+
|
|
69
|
+
// 7. Logout from the main dashboard
|
|
70
|
+
cy.get('[data-cy="topnav-user-menu-trigger"]').click()
|
|
71
|
+
cy.get('[data-cy="topnav-menu-signOut"]').should('be.visible').click()
|
|
72
|
+
|
|
73
|
+
// Verify redirected to login
|
|
74
|
+
cy.url().should('include', '/login')
|
|
75
|
+
cy.log('✅ Logout successful')
|
|
76
|
+
|
|
77
|
+
cy.log('✅ SuperAdmin flow completed successfully')
|
|
78
|
+
})
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
after(() => {
|
|
82
|
+
cy.log('✅ SuperAdmin authentication tests completed')
|
|
83
|
+
})
|
|
84
|
+
})
|