expressa 2.0.21 → 2.0.22
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/.circleci/config.yml +21 -21
- package/.eslintrc.json +29 -29
- package/.vscode/launch.json +19 -0
- package/LICENSE +21 -21
- package/README.md +137 -137
- package/auth/index.js +76 -76
- package/auth/jwt.js +31 -31
- package/controllers/collections.js +260 -260
- package/controllers/install.js +105 -105
- package/controllers/status.js +43 -43
- package/controllers/users.js +52 -52
- package/cypress/fixtures/example.json +4 -4
- package/cypress/integration/0_install_spec.js +8 -8
- package/cypress/integration/custom_collections.js +30 -30
- package/cypress/integration/home.js +9 -9
- package/cypress/integration/settings.js +34 -34
- package/cypress/integration/users.js +61 -61
- package/cypress/plugins/index.js +17 -17
- package/cypress/support/commands.js +69 -69
- package/cypress/support/index.js +20 -20
- package/cypress/support/util.js +10 -10
- package/cypress.config.js +18 -18
- package/cypress.json +4 -4
- package/db/cached.js +44 -40
- package/db/file.js +131 -112
- package/db/memory.js +92 -79
- package/db/mongo.js +93 -86
- package/db/postgres.js +100 -93
- package/doc/authentication.md +38 -38
- package/doc/automatic-fields.md +12 -12
- package/doc/blogexample.md +16 -16
- package/doc/custom-endpoints.md +20 -20
- package/doc/database.md +23 -23
- package/doc/development.md +33 -33
- package/doc/listeners.md +103 -103
- package/doc/modules.md +8 -8
- package/doc/permissions.md +14 -14
- package/doc/relationships.md +65 -65
- package/doc/testing.md +47 -47
- package/doc/uploading-files.md +53 -53
- package/index.js +297 -297
- package/listeners.js +65 -65
- package/listeners_collection_permissions.js +29 -29
- package/listeners_users.js +96 -96
- package/listeners_validation.js +43 -43
- package/middleware/logging.js +30 -30
- package/middleware/permissions.js +41 -41
- package/modules/access_keys/access_keys.js +32 -32
- package/modules/admin/.babelrc +19 -19
- package/modules/admin/.editorconfig +14 -14
- package/modules/admin/.eslintignore +5 -5
- package/modules/admin/.eslintrc.js +197 -197
- package/modules/admin/.postcssrc.js +10 -10
- package/modules/admin/.travis.yml +5 -5
- package/modules/admin/LICENSE +21 -21
- package/modules/admin/README.md +88 -88
- package/modules/admin/build/build.js +46 -46
- package/modules/admin/build/check-versions.js +64 -64
- package/modules/admin/build/utils.js +109 -109
- package/modules/admin/build/vue-loader.conf.js +5 -5
- package/modules/admin/build/webpack.base.conf.js +112 -112
- package/modules/admin/build/webpack.dev.conf.js +95 -95
- package/modules/admin/build/webpack.prod.conf.js +112 -112
- package/modules/admin/config/dev.env.js +8 -8
- package/modules/admin/config/index.js +86 -86
- package/modules/admin/config/prod.env.js +5 -5
- package/modules/admin/dist/css/136.1055b646.css +69 -0
- package/modules/admin/dist/css/136.1055b646.css.gz +0 -0
- package/modules/admin/dist/css/{430.8c9b0482.css → 165.e83d8cfe.css} +4 -4
- package/modules/admin/dist/css/165.e83d8cfe.css.gz +0 -0
- package/modules/admin/dist/css/220.e946bda7.css.gz +0 -0
- package/modules/admin/dist/css/{197.7a90435e.css → 236.e66ce8d8.css} +4 -4
- package/modules/admin/dist/css/236.e66ce8d8.css.gz +0 -0
- package/modules/admin/dist/css/338.1fd9d57c.css.gz +0 -0
- package/modules/admin/dist/css/{566.7a90435e.css → 566.e66ce8d8.css} +4 -4
- package/modules/admin/dist/css/566.e66ce8d8.css.gz +0 -0
- package/modules/admin/dist/css/76.46fe6799.css +66 -0
- package/modules/admin/dist/css/76.46fe6799.css.gz +0 -0
- package/modules/admin/dist/css/807.f450521e.css +1 -0
- package/modules/admin/dist/css/807.f450521e.css.gz +0 -0
- package/modules/admin/dist/css/{750.4086915d.css.gz → 913.4086915d.css.gz} +0 -0
- package/modules/admin/dist/css/{app.eba5f5e2.css → app.1c3232a3.css} +25 -25
- package/modules/admin/dist/css/app.1c3232a3.css.gz +0 -0
- package/modules/admin/dist/index.html +1 -1
- package/modules/admin/dist/static/js/115.108d0dd5.js +1 -0
- package/modules/admin/dist/static/js/115.108d0dd5.js.gz +0 -0
- package/modules/admin/dist/static/js/136.1f9f4cb0.js +1 -0
- package/modules/admin/dist/static/js/136.1f9f4cb0.js.gz +0 -0
- package/modules/admin/dist/static/js/165.b3d51941.js +1 -0
- package/modules/admin/dist/static/js/165.b3d51941.js.gz +0 -0
- package/modules/admin/dist/static/js/220.02b2cd49.js +1 -0
- package/modules/admin/dist/static/js/220.02b2cd49.js.gz +0 -0
- package/modules/admin/dist/static/js/236.98c79868.js +1 -0
- package/modules/admin/dist/static/js/236.98c79868.js.gz +0 -0
- package/modules/admin/dist/static/js/338.4ba49501.js +1 -0
- package/modules/admin/dist/static/js/338.4ba49501.js.gz +0 -0
- package/modules/admin/dist/static/js/381.a05421de.js +1 -0
- package/modules/admin/dist/static/js/381.a05421de.js.gz +0 -0
- package/modules/admin/dist/static/js/412.0914ff23.js +1 -0
- package/modules/admin/dist/static/js/412.0914ff23.js.gz +0 -0
- package/modules/admin/dist/static/js/533.507df4cb.js +1 -0
- package/modules/admin/dist/static/js/533.507df4cb.js.gz +0 -0
- package/modules/admin/dist/static/js/556.d7586b89.js +1 -0
- package/modules/admin/dist/static/js/556.d7586b89.js.gz +0 -0
- package/modules/admin/dist/static/js/76.811d0e96.js +1 -0
- package/modules/admin/dist/static/js/76.811d0e96.js.gz +0 -0
- package/modules/admin/dist/static/js/807.8b7455a7.js +1 -0
- package/modules/admin/dist/static/js/807.8b7455a7.js.gz +0 -0
- package/modules/admin/dist/static/js/913.8b376386.js +1 -0
- package/modules/admin/dist/static/js/913.8b376386.js.gz +0 -0
- package/modules/admin/dist/static/js/app.834abee4.js +2 -0
- package/modules/admin/dist/static/js/{app.083328f8.js.LICENSE.txt → app.834abee4.js.LICENSE.txt} +3 -3
- package/modules/admin/dist/static/js/app.834abee4.js.LICENSE.txt.gz +0 -0
- package/modules/admin/dist/static/js/app.834abee4.js.gz +0 -0
- package/modules/admin/index.html +16 -16
- package/modules/admin/package.json +102 -101
- package/modules/admin/src/App.vue +11 -11
- package/modules/admin/src/api/login.js +26 -26
- package/modules/admin/src/api/table.js +9 -9
- package/modules/admin/src/components/Breadcrumb/index.vue +79 -79
- package/modules/admin/src/components/Hamburger/index.vue +62 -62
- package/modules/admin/src/components/JSONEditor.vue +206 -180
- package/modules/admin/src/components/SvgIcon/index.vue +43 -43
- package/modules/admin/src/icons/index.js +9 -9
- package/modules/admin/src/icons/svgo.yml +22 -22
- package/modules/admin/src/main.js +42 -42
- package/modules/admin/src/permission.js +49 -49
- package/modules/admin/src/router/index.js +200 -200
- package/modules/admin/src/store/getters.js +11 -11
- package/modules/admin/src/store/index.js +17 -17
- package/modules/admin/src/store/modules/app.js +43 -43
- package/modules/admin/src/store/modules/user.js +104 -104
- package/modules/admin/src/styles/element-ui.scss +29 -29
- package/modules/admin/src/styles/index.scss +78 -78
- package/modules/admin/src/styles/mixin.scss +27 -27
- package/modules/admin/src/styles/sidebar.scss +133 -133
- package/modules/admin/src/styles/transition.scss +46 -46
- package/modules/admin/src/styles/variables.scss +4 -4
- package/modules/admin/src/utils/auth.js +15 -15
- package/modules/admin/src/utils/index.js +74 -74
- package/modules/admin/src/utils/request.js +47 -47
- package/modules/admin/src/utils/validate.js +31 -31
- package/modules/admin/src/views/404.vue +235 -235
- package/modules/admin/src/views/Dev.vue +33 -33
- package/modules/admin/src/views/EditDocument.vue +121 -121
- package/modules/admin/src/views/Endpoints.vue +279 -279
- package/modules/admin/src/views/Home.vue +84 -84
- package/modules/admin/src/views/Install.vue +79 -79
- package/modules/admin/src/views/ListDocuments.vue +72 -72
- package/modules/admin/src/views/ListDocuments2.vue +467 -467
- package/modules/admin/src/views/ManageListeners.vue +67 -67
- package/modules/admin/src/views/ManageMiddleware.vue +43 -43
- package/modules/admin/src/views/ManagePermissions.vue +75 -75
- package/modules/admin/src/views/ViewRequest.vue +77 -77
- package/modules/admin/src/views/form/index.vue +91 -91
- package/modules/admin/src/views/layout/Layout.vue +69 -69
- package/modules/admin/src/views/layout/components/AppMain.vue +41 -41
- package/modules/admin/src/views/layout/components/Navbar.vue +97 -97
- package/modules/admin/src/views/layout/components/Sidebar/Item.vue +29 -29
- package/modules/admin/src/views/layout/components/Sidebar/Link.vue +39 -39
- package/modules/admin/src/views/layout/components/Sidebar/SidebarItem.vue +103 -103
- package/modules/admin/src/views/layout/components/Sidebar/index.vue +62 -62
- package/modules/admin/src/views/layout/components/index.js +3 -3
- package/modules/admin/src/views/layout/mixin/ResizeHandler.js +41 -41
- package/modules/admin/src/views/login/index.vue +195 -195
- package/modules/admin/src/views/tree/index.vue +77 -77
- package/modules/collections/collections.js +39 -39
- package/modules/core/core.js +197 -197
- package/modules/logging/logging.js +88 -88
- package/modules/permissions/permissions.js +106 -106
- package/package.json +59 -59
- package/scripts/expressa +12 -12
- package/scripts/run_cypress_tests.sh +35 -35
- package/scripts/run_db_tests.sh +8 -8
- package/test/0-install.js +96 -96
- package/test/collections.js +431 -431
- package/test/collections.querying.js +288 -288
- package/test/db.js +258 -258
- package/test/db.strings.js +73 -73
- package/test/db.updating.js +186 -144
- package/test/logging.js +29 -29
- package/test/test.js +93 -93
- package/test/testserver.js +30 -30
- package/test/testutils.js +136 -136
- package/test/users.js +425 -425
- package/util.js +522 -522
- package/modules/admin/dist/css/197.7a90435e.css.gz +0 -0
- package/modules/admin/dist/css/430.8c9b0482.css.gz +0 -0
- package/modules/admin/dist/css/451.c6646d20.css +0 -1
- package/modules/admin/dist/css/451.c6646d20.css.gz +0 -0
- package/modules/admin/dist/css/566.7a90435e.css.gz +0 -0
- package/modules/admin/dist/css/569.f7d5c7d5.css +0 -37
- package/modules/admin/dist/css/569.f7d5c7d5.css.gz +0 -0
- package/modules/admin/dist/css/572.74d8e965.css +0 -34
- package/modules/admin/dist/css/572.74d8e965.css.gz +0 -0
- package/modules/admin/dist/css/651.e946bda7.css.gz +0 -0
- package/modules/admin/dist/css/950.1fd9d57c.css.gz +0 -0
- package/modules/admin/dist/css/app.eba5f5e2.css.gz +0 -0
- package/modules/admin/dist/static/js/197.e511d91e.js +0 -1
- package/modules/admin/dist/static/js/197.e511d91e.js.gz +0 -0
- package/modules/admin/dist/static/js/430.b3941f30.js +0 -1
- package/modules/admin/dist/static/js/430.b3941f30.js.gz +0 -0
- package/modules/admin/dist/static/js/451.645974a8.js +0 -1
- package/modules/admin/dist/static/js/451.645974a8.js.gz +0 -0
- package/modules/admin/dist/static/js/460.962d5bc0.js +0 -1
- package/modules/admin/dist/static/js/460.962d5bc0.js.gz +0 -0
- package/modules/admin/dist/static/js/550.f27feb23.js +0 -1
- package/modules/admin/dist/static/js/550.f27feb23.js.gz +0 -0
- package/modules/admin/dist/static/js/556.1e08866a.js +0 -1
- package/modules/admin/dist/static/js/556.1e08866a.js.gz +0 -0
- package/modules/admin/dist/static/js/569.0fecfbee.js +0 -1
- package/modules/admin/dist/static/js/569.0fecfbee.js.gz +0 -0
- package/modules/admin/dist/static/js/572.13392e1d.js +0 -1
- package/modules/admin/dist/static/js/572.13392e1d.js.gz +0 -0
- package/modules/admin/dist/static/js/603.7b34a650.js +0 -1
- package/modules/admin/dist/static/js/603.7b34a650.js.gz +0 -0
- package/modules/admin/dist/static/js/651.564b24b6.js +0 -1
- package/modules/admin/dist/static/js/651.564b24b6.js.gz +0 -0
- package/modules/admin/dist/static/js/653.02ec1098.js +0 -1
- package/modules/admin/dist/static/js/653.02ec1098.js.gz +0 -0
- package/modules/admin/dist/static/js/750.50c950da.js +0 -1
- package/modules/admin/dist/static/js/750.50c950da.js.gz +0 -0
- package/modules/admin/dist/static/js/950.d4ff0a18.js +0 -1
- package/modules/admin/dist/static/js/950.d4ff0a18.js.gz +0 -0
- package/modules/admin/dist/static/js/app.083328f8.js +0 -2
- package/modules/admin/dist/static/js/app.083328f8.js.LICENSE.txt.gz +0 -0
- package/modules/admin/dist/static/js/app.083328f8.js.gz +0 -0
- /package/modules/admin/dist/css/{651.e946bda7.css → 220.e946bda7.css} +0 -0
- /package/modules/admin/dist/css/{950.1fd9d57c.css → 338.1fd9d57c.css} +0 -0
- /package/modules/admin/dist/css/{750.4086915d.css → 913.4086915d.css} +0 -0
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
import { randomId } from '../support/util'
|
|
2
|
-
|
|
3
|
-
describe('User Management', function() {
|
|
4
|
-
it('Lists users', function() {
|
|
5
|
-
cy.server()
|
|
6
|
-
cy.route('/api/users/schema').as('userschema')
|
|
7
|
-
cy.route('/api/collection/users').as('users')
|
|
8
|
-
cy.login()
|
|
9
|
-
cy.visit('/')
|
|
10
|
-
|
|
11
|
-
// cy.visit('#/users/list')
|
|
12
|
-
cy.get('.hamburger-container').click();
|
|
13
|
-
cy.wait(100)
|
|
14
|
-
cy.get('span').contains('People').click();
|
|
15
|
-
cy.get('span').contains('Users').click();
|
|
16
|
-
cy.wait('@users')
|
|
17
|
-
// cy.get('a').contains('a@example.com').click();
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
cy.get('table tr:last-child td:first-child').click();
|
|
21
|
-
// cy.visit()
|
|
22
|
-
cy.wait('@userschema')
|
|
23
|
-
cy.get('input[name="root[email]"]').should('have.value', 'test@example.com')
|
|
24
|
-
// cy.get('a[href="#/users/list"]').click()
|
|
25
|
-
// cy.get('form').submit()
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
const id = randomId()
|
|
29
|
-
const email = `${id}@example.com`
|
|
30
|
-
const password = 'expressa2'
|
|
31
|
-
it('Can create a user', function () {
|
|
32
|
-
cy.server()
|
|
33
|
-
cy.route('/api/users/schema').as('userschema')
|
|
34
|
-
cy.route('/api/collection/users').as('users')
|
|
35
|
-
cy.login()
|
|
36
|
-
cy.visit('/')
|
|
37
|
-
|
|
38
|
-
cy.get('.hamburger-container').click();
|
|
39
|
-
cy.wait(100)
|
|
40
|
-
cy.get('span').contains('People').click();
|
|
41
|
-
cy.wait(100)
|
|
42
|
-
cy.get('span').contains('Add').click();
|
|
43
|
-
cy.get('input[name="root[email]"]').type(email)
|
|
44
|
-
cy.get('input[name="root[password]"]').type(password)
|
|
45
|
-
cy.get('input[name="root[password]"]').blur()
|
|
46
|
-
cy.get('.btn-primary').click()
|
|
47
|
-
cy.wait('@users')
|
|
48
|
-
cy.get('div').should('contain', 'test@example.com')
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
it('Can log in as non-admin, but cannot create users', function () {
|
|
52
|
-
cy.login(email, password)
|
|
53
|
-
cy.visit('/')
|
|
54
|
-
|
|
55
|
-
cy.get('.hamburger-container').click();
|
|
56
|
-
cy.get('span').contains('People').click();
|
|
57
|
-
cy.wait(100)
|
|
58
|
-
cy.get('span').contains('Add').click();
|
|
59
|
-
cy.get('div.error-message').should('contain', 'Request failed')
|
|
60
|
-
})
|
|
61
|
-
})
|
|
1
|
+
import { randomId } from '../support/util'
|
|
2
|
+
|
|
3
|
+
describe('User Management', function() {
|
|
4
|
+
it('Lists users', function() {
|
|
5
|
+
cy.server()
|
|
6
|
+
cy.route('/api/users/schema').as('userschema')
|
|
7
|
+
cy.route('/api/collection/users').as('users')
|
|
8
|
+
cy.login()
|
|
9
|
+
cy.visit('/')
|
|
10
|
+
|
|
11
|
+
// cy.visit('#/users/list')
|
|
12
|
+
cy.get('.hamburger-container').click();
|
|
13
|
+
cy.wait(100)
|
|
14
|
+
cy.get('span').contains('People').click();
|
|
15
|
+
cy.get('span').contains('Users').click();
|
|
16
|
+
cy.wait('@users')
|
|
17
|
+
// cy.get('a').contains('a@example.com').click();
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
cy.get('table tr:last-child td:first-child').click();
|
|
21
|
+
// cy.visit()
|
|
22
|
+
cy.wait('@userschema')
|
|
23
|
+
cy.get('input[name="root[email]"]').should('have.value', 'test@example.com')
|
|
24
|
+
// cy.get('a[href="#/users/list"]').click()
|
|
25
|
+
// cy.get('form').submit()
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
const id = randomId()
|
|
29
|
+
const email = `${id}@example.com`
|
|
30
|
+
const password = 'expressa2'
|
|
31
|
+
it('Can create a user', function () {
|
|
32
|
+
cy.server()
|
|
33
|
+
cy.route('/api/users/schema').as('userschema')
|
|
34
|
+
cy.route('/api/collection/users').as('users')
|
|
35
|
+
cy.login()
|
|
36
|
+
cy.visit('/')
|
|
37
|
+
|
|
38
|
+
cy.get('.hamburger-container').click();
|
|
39
|
+
cy.wait(100)
|
|
40
|
+
cy.get('span').contains('People').click();
|
|
41
|
+
cy.wait(100)
|
|
42
|
+
cy.get('span').contains('Add').click();
|
|
43
|
+
cy.get('input[name="root[email]"]').type(email)
|
|
44
|
+
cy.get('input[name="root[password]"]').type(password)
|
|
45
|
+
cy.get('input[name="root[password]"]').blur()
|
|
46
|
+
cy.get('.btn-primary').click()
|
|
47
|
+
cy.wait('@users')
|
|
48
|
+
cy.get('div').should('contain', 'test@example.com')
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
it('Can log in as non-admin, but cannot create users', function () {
|
|
52
|
+
cy.login(email, password)
|
|
53
|
+
cy.visit('/')
|
|
54
|
+
|
|
55
|
+
cy.get('.hamburger-container').click();
|
|
56
|
+
cy.get('span').contains('People').click();
|
|
57
|
+
cy.wait(100)
|
|
58
|
+
cy.get('span').contains('Add').click();
|
|
59
|
+
cy.get('div.error-message').should('contain', 'Request failed')
|
|
60
|
+
})
|
|
61
|
+
})
|
package/cypress/plugins/index.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
// ***********************************************************
|
|
2
|
-
// This example plugins/index.js can be used to load plugins
|
|
3
|
-
//
|
|
4
|
-
// You can change the location of this file or turn off loading
|
|
5
|
-
// the plugins file with the 'pluginsFile' configuration option.
|
|
6
|
-
//
|
|
7
|
-
// You can read more here:
|
|
8
|
-
// https://on.cypress.io/plugins-guide
|
|
9
|
-
// ***********************************************************
|
|
10
|
-
|
|
11
|
-
// This function is called when a project is opened or re-opened (e.g. due to
|
|
12
|
-
// the project's config changing)
|
|
13
|
-
|
|
14
|
-
module.exports = (on, config) => {
|
|
15
|
-
// `on` is used to hook into various events Cypress emits
|
|
16
|
-
// `config` is the resolved Cypress config
|
|
17
|
-
}
|
|
1
|
+
// ***********************************************************
|
|
2
|
+
// This example plugins/index.js can be used to load plugins
|
|
3
|
+
//
|
|
4
|
+
// You can change the location of this file or turn off loading
|
|
5
|
+
// the plugins file with the 'pluginsFile' configuration option.
|
|
6
|
+
//
|
|
7
|
+
// You can read more here:
|
|
8
|
+
// https://on.cypress.io/plugins-guide
|
|
9
|
+
// ***********************************************************
|
|
10
|
+
|
|
11
|
+
// This function is called when a project is opened or re-opened (e.g. due to
|
|
12
|
+
// the project's config changing)
|
|
13
|
+
|
|
14
|
+
module.exports = (on, config) => {
|
|
15
|
+
// `on` is used to hook into various events Cypress emits
|
|
16
|
+
// `config` is the resolved Cypress config
|
|
17
|
+
}
|
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
// ***********************************************
|
|
2
|
-
// This example commands.js shows you how to
|
|
3
|
-
// create various custom commands and overwrite
|
|
4
|
-
// existing commands.
|
|
5
|
-
//
|
|
6
|
-
// For more comprehensive examples of custom
|
|
7
|
-
// commands please read more here:
|
|
8
|
-
// https://on.cypress.io/custom-commands
|
|
9
|
-
// ***********************************************
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// -- This is a parent command --
|
|
13
|
-
// Cypress.Commands.add("login", (email, password) => { ... })
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
// -- This is a child command --
|
|
17
|
-
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
// -- This is a dual command --
|
|
21
|
-
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
// -- This will overwrite an existing command --
|
|
25
|
-
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
|
|
26
|
-
|
|
27
|
-
Cypress.Commands.overwrite('server', () => {
|
|
28
|
-
// no-op polyfill for deprecated cy.server
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
Cypress.Commands.overwrite('route', (originalFn, arg1, arg2, arg3) => {
|
|
32
|
-
// polyfill cy.route to cy.intercept for Cypress >= 10
|
|
33
|
-
if (typeof arg2 === 'undefined' && typeof arg3 === 'undefined') {
|
|
34
|
-
return cy.intercept(arg1)
|
|
35
|
-
}
|
|
36
|
-
if (typeof arg3 === 'undefined') {
|
|
37
|
-
return cy.intercept(arg1, arg2)
|
|
38
|
-
}
|
|
39
|
-
return cy.intercept(arg1, arg2, arg3)
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
Cypress.Commands.add('randomId', (length) => {
|
|
43
|
-
var text = "";
|
|
44
|
-
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
45
|
-
|
|
46
|
-
for (var i = 0; i < length || 10; i++)
|
|
47
|
-
text += possible.charAt(Math.floor(Math.random() * possible.length));
|
|
48
|
-
|
|
49
|
-
return text;
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
Cypress.Commands.add('fillValue', (path, value) => {
|
|
53
|
-
cy.get(`input[name="root[${path}]"]`).type(value)
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
Cypress.Commands.add('login', (email, password) => {
|
|
57
|
-
cy.request({
|
|
58
|
-
method: 'POST',
|
|
59
|
-
url: 'http://localhost:3001/api/users/login',
|
|
60
|
-
body: {
|
|
61
|
-
email: email || 'test@example.com',
|
|
62
|
-
password: password || 'expressa',
|
|
63
|
-
}
|
|
64
|
-
})
|
|
65
|
-
.then((resp) => {
|
|
66
|
-
cy.setCookie('Admin-Token', resp.body.token);
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
})
|
|
1
|
+
// ***********************************************
|
|
2
|
+
// This example commands.js shows you how to
|
|
3
|
+
// create various custom commands and overwrite
|
|
4
|
+
// existing commands.
|
|
5
|
+
//
|
|
6
|
+
// For more comprehensive examples of custom
|
|
7
|
+
// commands please read more here:
|
|
8
|
+
// https://on.cypress.io/custom-commands
|
|
9
|
+
// ***********************************************
|
|
10
|
+
//
|
|
11
|
+
//
|
|
12
|
+
// -- This is a parent command --
|
|
13
|
+
// Cypress.Commands.add("login", (email, password) => { ... })
|
|
14
|
+
//
|
|
15
|
+
//
|
|
16
|
+
// -- This is a child command --
|
|
17
|
+
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
|
|
18
|
+
//
|
|
19
|
+
//
|
|
20
|
+
// -- This is a dual command --
|
|
21
|
+
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
|
|
22
|
+
//
|
|
23
|
+
//
|
|
24
|
+
// -- This will overwrite an existing command --
|
|
25
|
+
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
|
|
26
|
+
|
|
27
|
+
Cypress.Commands.overwrite('server', () => {
|
|
28
|
+
// no-op polyfill for deprecated cy.server
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
Cypress.Commands.overwrite('route', (originalFn, arg1, arg2, arg3) => {
|
|
32
|
+
// polyfill cy.route to cy.intercept for Cypress >= 10
|
|
33
|
+
if (typeof arg2 === 'undefined' && typeof arg3 === 'undefined') {
|
|
34
|
+
return cy.intercept(arg1)
|
|
35
|
+
}
|
|
36
|
+
if (typeof arg3 === 'undefined') {
|
|
37
|
+
return cy.intercept(arg1, arg2)
|
|
38
|
+
}
|
|
39
|
+
return cy.intercept(arg1, arg2, arg3)
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
Cypress.Commands.add('randomId', (length) => {
|
|
43
|
+
var text = "";
|
|
44
|
+
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
45
|
+
|
|
46
|
+
for (var i = 0; i < length || 10; i++)
|
|
47
|
+
text += possible.charAt(Math.floor(Math.random() * possible.length));
|
|
48
|
+
|
|
49
|
+
return text;
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
Cypress.Commands.add('fillValue', (path, value) => {
|
|
53
|
+
cy.get(`input[name="root[${path}]"]`).type(value)
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
Cypress.Commands.add('login', (email, password) => {
|
|
57
|
+
cy.request({
|
|
58
|
+
method: 'POST',
|
|
59
|
+
url: 'http://localhost:3001/api/users/login',
|
|
60
|
+
body: {
|
|
61
|
+
email: email || 'test@example.com',
|
|
62
|
+
password: password || 'expressa',
|
|
63
|
+
}
|
|
64
|
+
})
|
|
65
|
+
.then((resp) => {
|
|
66
|
+
cy.setCookie('Admin-Token', resp.body.token);
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
})
|
package/cypress/support/index.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
// ***********************************************************
|
|
2
|
-
// This example support/index.js is processed and
|
|
3
|
-
// loaded automatically before your test files.
|
|
4
|
-
//
|
|
5
|
-
// This is a great place to put global configuration and
|
|
6
|
-
// behavior that modifies Cypress.
|
|
7
|
-
//
|
|
8
|
-
// You can change the location of this file or turn off
|
|
9
|
-
// automatically serving support files with the
|
|
10
|
-
// 'supportFile' configuration option.
|
|
11
|
-
//
|
|
12
|
-
// You can read more here:
|
|
13
|
-
// https://on.cypress.io/configuration
|
|
14
|
-
// ***********************************************************
|
|
15
|
-
|
|
16
|
-
// Import commands.js using ES2015 syntax:
|
|
17
|
-
import './commands'
|
|
18
|
-
|
|
19
|
-
// Alternatively you can use CommonJS syntax:
|
|
20
|
-
// require('./commands')
|
|
1
|
+
// ***********************************************************
|
|
2
|
+
// This example support/index.js is processed and
|
|
3
|
+
// loaded automatically before your test files.
|
|
4
|
+
//
|
|
5
|
+
// This is a great place to put global configuration and
|
|
6
|
+
// behavior that modifies Cypress.
|
|
7
|
+
//
|
|
8
|
+
// You can change the location of this file or turn off
|
|
9
|
+
// automatically serving support files with the
|
|
10
|
+
// 'supportFile' configuration option.
|
|
11
|
+
//
|
|
12
|
+
// You can read more here:
|
|
13
|
+
// https://on.cypress.io/configuration
|
|
14
|
+
// ***********************************************************
|
|
15
|
+
|
|
16
|
+
// Import commands.js using ES2015 syntax:
|
|
17
|
+
import './commands'
|
|
18
|
+
|
|
19
|
+
// Alternatively you can use CommonJS syntax:
|
|
20
|
+
// require('./commands')
|
package/cypress/support/util.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export function randomId(length) {
|
|
2
|
-
var text = "";
|
|
3
|
-
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
4
|
-
|
|
5
|
-
for (var i = 0; i < (length || 10); i++) {
|
|
6
|
-
text += possible.charAt(Math.floor(Math.random() * possible.length))
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
return text;
|
|
10
|
-
}
|
|
1
|
+
export function randomId(length) {
|
|
2
|
+
var text = "";
|
|
3
|
+
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
4
|
+
|
|
5
|
+
for (var i = 0; i < (length || 10); i++) {
|
|
6
|
+
text += possible.charAt(Math.floor(Math.random() * possible.length))
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
return text;
|
|
10
|
+
}
|
package/cypress.config.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
// Configure Cypress v10+ while preserving legacy folder structure
|
|
2
|
-
// https://docs.cypress.io/guides/references/configuration
|
|
3
|
-
|
|
4
|
-
const { defineConfig } = require('cypress')
|
|
5
|
-
|
|
6
|
-
module.exports = defineConfig({
|
|
7
|
-
e2e: {
|
|
8
|
-
// Keep using the legacy integration tests directory
|
|
9
|
-
specPattern: 'cypress/integration/**/*.js',
|
|
10
|
-
supportFile: 'cypress/support/index.js',
|
|
11
|
-
baseUrl: 'http://localhost:3001/admin',
|
|
12
|
-
setupNodeEvents(on, config) {
|
|
13
|
-
// no plugins yet
|
|
14
|
-
return config
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
video: false
|
|
18
|
-
})
|
|
1
|
+
// Configure Cypress v10+ while preserving legacy folder structure
|
|
2
|
+
// https://docs.cypress.io/guides/references/configuration
|
|
3
|
+
|
|
4
|
+
const { defineConfig } = require('cypress')
|
|
5
|
+
|
|
6
|
+
module.exports = defineConfig({
|
|
7
|
+
e2e: {
|
|
8
|
+
// Keep using the legacy integration tests directory
|
|
9
|
+
specPattern: 'cypress/integration/**/*.js',
|
|
10
|
+
supportFile: 'cypress/support/index.js',
|
|
11
|
+
baseUrl: 'http://localhost:3001/admin',
|
|
12
|
+
setupNodeEvents(on, config) {
|
|
13
|
+
// no plugins yet
|
|
14
|
+
return config
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
video: false
|
|
18
|
+
})
|
package/cypress.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
{
|
|
2
|
-
"video": false,
|
|
3
|
-
"baseUrl": "http://localhost:3001/admin"
|
|
4
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"video": false,
|
|
3
|
+
"baseUrl": "http://localhost:3001/admin"
|
|
4
|
+
}
|
package/db/cached.js
CHANGED
|
@@ -1,40 +1,44 @@
|
|
|
1
|
-
module.exports = function (storage) {
|
|
2
|
-
const cache = require('./memory')()
|
|
3
|
-
|
|
4
|
-
return {
|
|
5
|
-
cache: cache,
|
|
6
|
-
init: async function () {
|
|
7
|
-
await Promise.resolve(storage.init())
|
|
8
|
-
const data = await storage.all()
|
|
9
|
-
await Promise.all(data.map((doc) => cache.create(doc)))
|
|
10
|
-
},
|
|
11
|
-
all: function () {
|
|
12
|
-
return cache.all()
|
|
13
|
-
},
|
|
14
|
-
find: function (query, offset, limit, orderby, fields) {
|
|
15
|
-
return cache.find(query, offset, limit, orderby, fields)
|
|
16
|
-
},
|
|
17
|
-
count: async function(...params) {
|
|
18
|
-
return await cache.count(...params)
|
|
19
|
-
},
|
|
20
|
-
get: function (id, fields) {
|
|
21
|
-
return cache.get(id, fields)
|
|
22
|
-
},
|
|
23
|
-
create: async function (data) {
|
|
24
|
-
await cache.create(data)
|
|
25
|
-
return storage.create(data)
|
|
26
|
-
},
|
|
27
|
-
update: async function (id, data) {
|
|
28
|
-
await cache.update(id, data)
|
|
29
|
-
return storage.update(id, data)
|
|
30
|
-
},
|
|
31
|
-
updateWithQuery: async function (query, update, options) {
|
|
32
|
-
await cache.updateWithQuery(query, update, options)
|
|
33
|
-
return storage.updateWithQuery(query, update, options)
|
|
34
|
-
},
|
|
35
|
-
|
|
36
|
-
await cache.
|
|
37
|
-
return storage.
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
1
|
+
module.exports = function (storage) {
|
|
2
|
+
const cache = require('./memory')()
|
|
3
|
+
|
|
4
|
+
return {
|
|
5
|
+
cache: cache,
|
|
6
|
+
init: async function () {
|
|
7
|
+
await Promise.resolve(storage.init())
|
|
8
|
+
const data = await storage.all()
|
|
9
|
+
await Promise.all(data.map((doc) => cache.create(doc)))
|
|
10
|
+
},
|
|
11
|
+
all: function () {
|
|
12
|
+
return cache.all()
|
|
13
|
+
},
|
|
14
|
+
find: function (query, offset, limit, orderby, fields) {
|
|
15
|
+
return cache.find(query, offset, limit, orderby, fields)
|
|
16
|
+
},
|
|
17
|
+
count: async function(...params) {
|
|
18
|
+
return await cache.count(...params)
|
|
19
|
+
},
|
|
20
|
+
get: function (id, fields) {
|
|
21
|
+
return cache.get(id, fields)
|
|
22
|
+
},
|
|
23
|
+
create: async function (data) {
|
|
24
|
+
await cache.create(data)
|
|
25
|
+
return storage.create(data)
|
|
26
|
+
},
|
|
27
|
+
update: async function (id, data) {
|
|
28
|
+
await cache.update(id, data)
|
|
29
|
+
return storage.update(id, data)
|
|
30
|
+
},
|
|
31
|
+
updateWithQuery: async function (query, update, options) {
|
|
32
|
+
await cache.updateWithQuery(query, update, options)
|
|
33
|
+
return storage.updateWithQuery(query, update, options)
|
|
34
|
+
},
|
|
35
|
+
updateWithQuerySingle: async function (id, update, options) {
|
|
36
|
+
await cache.updateWithQuerySingle(id, update, options)
|
|
37
|
+
return storage.updateWithQuerySingle(id, update, options)
|
|
38
|
+
},
|
|
39
|
+
delete: async function (id) {
|
|
40
|
+
await cache.delete(id)
|
|
41
|
+
return storage.delete(id)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|