[GH-42] Cypress tests for login actions (#1679)
* Testing API added to server:
- registered only if `enableTestingAPI` is set to `true` in the config file
- has only one route `test/reset`
- reset clears the tables in db for blocks, users, sessions
- functions `DeleteAllBlocks` and `DeleteAllUsers` added to `Store` interface
- new functions implemented for `SQLStore`
* Cypress tests (initial version) for login actions added:
- redirect to login page,
- register user,
- test for loading home page deleted,
- allow js in `tsconfig.json` for cypress tests.
* Cypress tests for login actions:
- check that main page with workspace is visible after registration,
- initial version of test for login of register user.
* Cypress tests for login actions:
- function for checking that workspace is available added,
- functions for login and logout added,
- test for password change added,
- session parameters added to server config for cypress testing.
* Switch Cypress tests to typescript.
* Use ids for inputs instead of placeholder text.
* Use cypress request for login without loading login page.
* Cypress custom command for login added.
* Cypress tests fixed:
- new cypress commands for server reset, register/login user
- single test for "create and delete board/card"
- fixes for `BoardPage` component useEffect callbacks
- npm script `runserver-test` doesn't use single user mode
* Deletion of all blocks changed:
- also deletes blocks from history
- public function renamed to DeleteAllBlocksPermanently
- code for mocks and public methods generated
* Server tests for files fixed on windows.
* Cypress tests for the registration of second user via invite link added.
* Added `baseUrl` in main `tsconfig.json` (required by cypress configuration).
* Cypress test fixed. Comments as well as log messages added.
* Log a message if testing API is enabled.
* Single cypress test for register/login actions.
* Revert changes to server.
* More convenient cypress commands:
- all API calls made as separate commands
- declarations for commands moved to separate global.d.ts file
- utility functions moved after test actions in 'Login actions' test
2021-11-22 17:59:01 +02:00
|
|
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
|
|
// See LICENSE.txt for license information.
|
|
|
|
|
2021-12-15 18:57:58 +02:00
|
|
|
import {Board} from '../../src/blocks/board'
|
2022-02-28 13:28:16 +02:00
|
|
|
import {UserConfigPatch} from '../../src/user'
|
2021-12-15 18:57:58 +02:00
|
|
|
|
[GH-42] Cypress tests for login actions (#1679)
* Testing API added to server:
- registered only if `enableTestingAPI` is set to `true` in the config file
- has only one route `test/reset`
- reset clears the tables in db for blocks, users, sessions
- functions `DeleteAllBlocks` and `DeleteAllUsers` added to `Store` interface
- new functions implemented for `SQLStore`
* Cypress tests (initial version) for login actions added:
- redirect to login page,
- register user,
- test for loading home page deleted,
- allow js in `tsconfig.json` for cypress tests.
* Cypress tests for login actions:
- check that main page with workspace is visible after registration,
- initial version of test for login of register user.
* Cypress tests for login actions:
- function for checking that workspace is available added,
- functions for login and logout added,
- test for password change added,
- session parameters added to server config for cypress testing.
* Switch Cypress tests to typescript.
* Use ids for inputs instead of placeholder text.
* Use cypress request for login without loading login page.
* Cypress custom command for login added.
* Cypress tests fixed:
- new cypress commands for server reset, register/login user
- single test for "create and delete board/card"
- fixes for `BoardPage` component useEffect callbacks
- npm script `runserver-test` doesn't use single user mode
* Deletion of all blocks changed:
- also deletes blocks from history
- public function renamed to DeleteAllBlocksPermanently
- code for mocks and public methods generated
* Server tests for files fixed on windows.
* Cypress tests for the registration of second user via invite link added.
* Added `baseUrl` in main `tsconfig.json` (required by cypress configuration).
* Cypress test fixed. Comments as well as log messages added.
* Log a message if testing API is enabled.
* Single cypress test for register/login actions.
* Revert changes to server.
* More convenient cypress commands:
- all API calls made as separate commands
- declarations for commands moved to separate global.d.ts file
- utility functions moved after test actions in 'Login actions' test
2021-11-22 17:59:01 +02:00
|
|
|
Cypress.Commands.add('apiRegisterUser', (data: Cypress.UserData, token?: string, failOnError?: boolean) => {
|
|
|
|
return cy.request({
|
|
|
|
method: 'POST',
|
2022-04-13 22:24:32 +02:00
|
|
|
url: '/api/v2/register',
|
[GH-42] Cypress tests for login actions (#1679)
* Testing API added to server:
- registered only if `enableTestingAPI` is set to `true` in the config file
- has only one route `test/reset`
- reset clears the tables in db for blocks, users, sessions
- functions `DeleteAllBlocks` and `DeleteAllUsers` added to `Store` interface
- new functions implemented for `SQLStore`
* Cypress tests (initial version) for login actions added:
- redirect to login page,
- register user,
- test for loading home page deleted,
- allow js in `tsconfig.json` for cypress tests.
* Cypress tests for login actions:
- check that main page with workspace is visible after registration,
- initial version of test for login of register user.
* Cypress tests for login actions:
- function for checking that workspace is available added,
- functions for login and logout added,
- test for password change added,
- session parameters added to server config for cypress testing.
* Switch Cypress tests to typescript.
* Use ids for inputs instead of placeholder text.
* Use cypress request for login without loading login page.
* Cypress custom command for login added.
* Cypress tests fixed:
- new cypress commands for server reset, register/login user
- single test for "create and delete board/card"
- fixes for `BoardPage` component useEffect callbacks
- npm script `runserver-test` doesn't use single user mode
* Deletion of all blocks changed:
- also deletes blocks from history
- public function renamed to DeleteAllBlocksPermanently
- code for mocks and public methods generated
* Server tests for files fixed on windows.
* Cypress tests for the registration of second user via invite link added.
* Added `baseUrl` in main `tsconfig.json` (required by cypress configuration).
* Cypress test fixed. Comments as well as log messages added.
* Log a message if testing API is enabled.
* Single cypress test for register/login actions.
* Revert changes to server.
* More convenient cypress commands:
- all API calls made as separate commands
- declarations for commands moved to separate global.d.ts file
- utility functions moved after test actions in 'Login actions' test
2021-11-22 17:59:01 +02:00
|
|
|
body: {
|
|
|
|
...data,
|
|
|
|
token,
|
|
|
|
},
|
|
|
|
headers: {
|
|
|
|
'X-Requested-With': 'XMLHttpRequest',
|
|
|
|
},
|
|
|
|
failOnStatusCode: failOnError,
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
Cypress.Commands.add('apiLoginUser', (data: Cypress.LoginData) => {
|
|
|
|
return cy.request({
|
|
|
|
method: 'POST',
|
2022-04-13 22:24:32 +02:00
|
|
|
url: '/api/v2/login',
|
[GH-42] Cypress tests for login actions (#1679)
* Testing API added to server:
- registered only if `enableTestingAPI` is set to `true` in the config file
- has only one route `test/reset`
- reset clears the tables in db for blocks, users, sessions
- functions `DeleteAllBlocks` and `DeleteAllUsers` added to `Store` interface
- new functions implemented for `SQLStore`
* Cypress tests (initial version) for login actions added:
- redirect to login page,
- register user,
- test for loading home page deleted,
- allow js in `tsconfig.json` for cypress tests.
* Cypress tests for login actions:
- check that main page with workspace is visible after registration,
- initial version of test for login of register user.
* Cypress tests for login actions:
- function for checking that workspace is available added,
- functions for login and logout added,
- test for password change added,
- session parameters added to server config for cypress testing.
* Switch Cypress tests to typescript.
* Use ids for inputs instead of placeholder text.
* Use cypress request for login without loading login page.
* Cypress custom command for login added.
* Cypress tests fixed:
- new cypress commands for server reset, register/login user
- single test for "create and delete board/card"
- fixes for `BoardPage` component useEffect callbacks
- npm script `runserver-test` doesn't use single user mode
* Deletion of all blocks changed:
- also deletes blocks from history
- public function renamed to DeleteAllBlocksPermanently
- code for mocks and public methods generated
* Server tests for files fixed on windows.
* Cypress tests for the registration of second user via invite link added.
* Added `baseUrl` in main `tsconfig.json` (required by cypress configuration).
* Cypress test fixed. Comments as well as log messages added.
* Log a message if testing API is enabled.
* Single cypress test for register/login actions.
* Revert changes to server.
* More convenient cypress commands:
- all API calls made as separate commands
- declarations for commands moved to separate global.d.ts file
- utility functions moved after test actions in 'Login actions' test
2021-11-22 17:59:01 +02:00
|
|
|
body: {
|
|
|
|
...data,
|
|
|
|
type: 'normal',
|
|
|
|
},
|
|
|
|
headers: {
|
|
|
|
'X-Requested-With': 'XMLHttpRequest',
|
|
|
|
},
|
|
|
|
}).then((response) => {
|
|
|
|
expect(response.body).to.have.property('token')
|
|
|
|
localStorage.setItem('focalboardSessionId', response.body.token)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2021-12-15 18:57:58 +02:00
|
|
|
const headers = () => ({
|
|
|
|
headers: {
|
|
|
|
'X-Requested-With': 'XMLHttpRequest',
|
|
|
|
Authorization: `Bearer ${localStorage.getItem('focalboardSessionId')}`,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
[GH-42] Cypress tests for login actions (#1679)
* Testing API added to server:
- registered only if `enableTestingAPI` is set to `true` in the config file
- has only one route `test/reset`
- reset clears the tables in db for blocks, users, sessions
- functions `DeleteAllBlocks` and `DeleteAllUsers` added to `Store` interface
- new functions implemented for `SQLStore`
* Cypress tests (initial version) for login actions added:
- redirect to login page,
- register user,
- test for loading home page deleted,
- allow js in `tsconfig.json` for cypress tests.
* Cypress tests for login actions:
- check that main page with workspace is visible after registration,
- initial version of test for login of register user.
* Cypress tests for login actions:
- function for checking that workspace is available added,
- functions for login and logout added,
- test for password change added,
- session parameters added to server config for cypress testing.
* Switch Cypress tests to typescript.
* Use ids for inputs instead of placeholder text.
* Use cypress request for login without loading login page.
* Cypress custom command for login added.
* Cypress tests fixed:
- new cypress commands for server reset, register/login user
- single test for "create and delete board/card"
- fixes for `BoardPage` component useEffect callbacks
- npm script `runserver-test` doesn't use single user mode
* Deletion of all blocks changed:
- also deletes blocks from history
- public function renamed to DeleteAllBlocksPermanently
- code for mocks and public methods generated
* Server tests for files fixed on windows.
* Cypress tests for the registration of second user via invite link added.
* Added `baseUrl` in main `tsconfig.json` (required by cypress configuration).
* Cypress test fixed. Comments as well as log messages added.
* Log a message if testing API is enabled.
* Single cypress test for register/login actions.
* Revert changes to server.
* More convenient cypress commands:
- all API calls made as separate commands
- declarations for commands moved to separate global.d.ts file
- utility functions moved after test actions in 'Login actions' test
2021-11-22 17:59:01 +02:00
|
|
|
Cypress.Commands.add('apiInitServer', () => {
|
|
|
|
const data: Cypress.UserData = {
|
|
|
|
username: Cypress.env('username'),
|
|
|
|
password: Cypress.env('password'),
|
|
|
|
email: Cypress.env('email'),
|
|
|
|
}
|
|
|
|
return cy.apiRegisterUser(data, '', false).apiLoginUser(data)
|
|
|
|
})
|
|
|
|
|
2022-03-29 22:45:20 +02:00
|
|
|
Cypress.Commands.add('apiDeleteBoard', (id: string) => {
|
2021-12-15 18:57:58 +02:00
|
|
|
return cy.request({
|
|
|
|
method: 'DELETE',
|
2022-04-13 22:24:32 +02:00
|
|
|
url: `/api/v2/boards/${encodeURIComponent(id)}`,
|
2021-12-15 18:57:58 +02:00
|
|
|
...headers(),
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2022-03-29 22:45:20 +02:00
|
|
|
const deleteBoards = (ids: string[]) => {
|
2021-12-15 18:57:58 +02:00
|
|
|
if (ids.length === 0) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
const [id, ...other] = ids
|
2022-03-29 22:45:20 +02:00
|
|
|
cy.apiDeleteBoard(id).then(() => deleteBoards(other))
|
2021-12-15 18:57:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
Cypress.Commands.add('apiResetBoards', () => {
|
|
|
|
return cy.request({
|
|
|
|
method: 'GET',
|
2022-04-13 22:24:32 +02:00
|
|
|
url: '/api/v2/teams/0/boards',
|
2021-12-15 18:57:58 +02:00
|
|
|
...headers(),
|
|
|
|
}).then((response) => {
|
|
|
|
if (Array.isArray(response.body)) {
|
|
|
|
const boards = response.body as Board[]
|
2022-03-23 20:14:07 +02:00
|
|
|
const toDelete = boards.filter((b) => !b.isTemplate).map((b) => b.id)
|
2022-03-29 22:45:20 +02:00
|
|
|
deleteBoards(toDelete)
|
2021-12-15 18:57:58 +02:00
|
|
|
}
|
|
|
|
})
|
[GH-42] Cypress tests for login actions (#1679)
* Testing API added to server:
- registered only if `enableTestingAPI` is set to `true` in the config file
- has only one route `test/reset`
- reset clears the tables in db for blocks, users, sessions
- functions `DeleteAllBlocks` and `DeleteAllUsers` added to `Store` interface
- new functions implemented for `SQLStore`
* Cypress tests (initial version) for login actions added:
- redirect to login page,
- register user,
- test for loading home page deleted,
- allow js in `tsconfig.json` for cypress tests.
* Cypress tests for login actions:
- check that main page with workspace is visible after registration,
- initial version of test for login of register user.
* Cypress tests for login actions:
- function for checking that workspace is available added,
- functions for login and logout added,
- test for password change added,
- session parameters added to server config for cypress testing.
* Switch Cypress tests to typescript.
* Use ids for inputs instead of placeholder text.
* Use cypress request for login without loading login page.
* Cypress custom command for login added.
* Cypress tests fixed:
- new cypress commands for server reset, register/login user
- single test for "create and delete board/card"
- fixes for `BoardPage` component useEffect callbacks
- npm script `runserver-test` doesn't use single user mode
* Deletion of all blocks changed:
- also deletes blocks from history
- public function renamed to DeleteAllBlocksPermanently
- code for mocks and public methods generated
* Server tests for files fixed on windows.
* Cypress tests for the registration of second user via invite link added.
* Added `baseUrl` in main `tsconfig.json` (required by cypress configuration).
* Cypress test fixed. Comments as well as log messages added.
* Log a message if testing API is enabled.
* Single cypress test for register/login actions.
* Revert changes to server.
* More convenient cypress commands:
- all API calls made as separate commands
- declarations for commands moved to separate global.d.ts file
- utility functions moved after test actions in 'Login actions' test
2021-11-22 17:59:01 +02:00
|
|
|
})
|
|
|
|
|
2022-02-28 13:28:16 +02:00
|
|
|
Cypress.Commands.add('apiSkipTour', (userID: string) => {
|
|
|
|
const body: UserConfigPatch = {
|
|
|
|
updatedFields: {
|
|
|
|
focalboard_welcomePageViewed: '1',
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
return cy.request({
|
|
|
|
method: 'PUT',
|
2022-04-13 22:24:32 +02:00
|
|
|
url: `/api/v2/users/${encodeURIComponent(userID)}/config`,
|
2022-02-28 13:28:16 +02:00
|
|
|
...headers(),
|
|
|
|
body,
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
[GH-42] Cypress tests for login actions (#1679)
* Testing API added to server:
- registered only if `enableTestingAPI` is set to `true` in the config file
- has only one route `test/reset`
- reset clears the tables in db for blocks, users, sessions
- functions `DeleteAllBlocks` and `DeleteAllUsers` added to `Store` interface
- new functions implemented for `SQLStore`
* Cypress tests (initial version) for login actions added:
- redirect to login page,
- register user,
- test for loading home page deleted,
- allow js in `tsconfig.json` for cypress tests.
* Cypress tests for login actions:
- check that main page with workspace is visible after registration,
- initial version of test for login of register user.
* Cypress tests for login actions:
- function for checking that workspace is available added,
- functions for login and logout added,
- test for password change added,
- session parameters added to server config for cypress testing.
* Switch Cypress tests to typescript.
* Use ids for inputs instead of placeholder text.
* Use cypress request for login without loading login page.
* Cypress custom command for login added.
* Cypress tests fixed:
- new cypress commands for server reset, register/login user
- single test for "create and delete board/card"
- fixes for `BoardPage` component useEffect callbacks
- npm script `runserver-test` doesn't use single user mode
* Deletion of all blocks changed:
- also deletes blocks from history
- public function renamed to DeleteAllBlocksPermanently
- code for mocks and public methods generated
* Server tests for files fixed on windows.
* Cypress tests for the registration of second user via invite link added.
* Added `baseUrl` in main `tsconfig.json` (required by cypress configuration).
* Cypress test fixed. Comments as well as log messages added.
* Log a message if testing API is enabled.
* Single cypress test for register/login actions.
* Revert changes to server.
* More convenient cypress commands:
- all API calls made as separate commands
- declarations for commands moved to separate global.d.ts file
- utility functions moved after test actions in 'Login actions' test
2021-11-22 17:59:01 +02:00
|
|
|
Cypress.Commands.add('apiGetMe', () => {
|
|
|
|
return cy.request({
|
|
|
|
method: 'GET',
|
2022-04-13 22:24:32 +02:00
|
|
|
url: '/api/v2/users/me',
|
[GH-42] Cypress tests for login actions (#1679)
* Testing API added to server:
- registered only if `enableTestingAPI` is set to `true` in the config file
- has only one route `test/reset`
- reset clears the tables in db for blocks, users, sessions
- functions `DeleteAllBlocks` and `DeleteAllUsers` added to `Store` interface
- new functions implemented for `SQLStore`
* Cypress tests (initial version) for login actions added:
- redirect to login page,
- register user,
- test for loading home page deleted,
- allow js in `tsconfig.json` for cypress tests.
* Cypress tests for login actions:
- check that main page with workspace is visible after registration,
- initial version of test for login of register user.
* Cypress tests for login actions:
- function for checking that workspace is available added,
- functions for login and logout added,
- test for password change added,
- session parameters added to server config for cypress testing.
* Switch Cypress tests to typescript.
* Use ids for inputs instead of placeholder text.
* Use cypress request for login without loading login page.
* Cypress custom command for login added.
* Cypress tests fixed:
- new cypress commands for server reset, register/login user
- single test for "create and delete board/card"
- fixes for `BoardPage` component useEffect callbacks
- npm script `runserver-test` doesn't use single user mode
* Deletion of all blocks changed:
- also deletes blocks from history
- public function renamed to DeleteAllBlocksPermanently
- code for mocks and public methods generated
* Server tests for files fixed on windows.
* Cypress tests for the registration of second user via invite link added.
* Added `baseUrl` in main `tsconfig.json` (required by cypress configuration).
* Cypress test fixed. Comments as well as log messages added.
* Log a message if testing API is enabled.
* Single cypress test for register/login actions.
* Revert changes to server.
* More convenient cypress commands:
- all API calls made as separate commands
- declarations for commands moved to separate global.d.ts file
- utility functions moved after test actions in 'Login actions' test
2021-11-22 17:59:01 +02:00
|
|
|
...headers(),
|
|
|
|
}).then((response) => response.body.id)
|
|
|
|
})
|
|
|
|
|
|
|
|
Cypress.Commands.add('apiChangePassword', (userId: string, oldPassword: string, newPassword: string) => {
|
|
|
|
const body = {oldPassword, newPassword}
|
|
|
|
return cy.request({
|
|
|
|
method: 'POST',
|
2022-04-13 22:24:32 +02:00
|
|
|
url: `/api/v2/users/${encodeURIComponent(userId)}/changepassword`,
|
[GH-42] Cypress tests for login actions (#1679)
* Testing API added to server:
- registered only if `enableTestingAPI` is set to `true` in the config file
- has only one route `test/reset`
- reset clears the tables in db for blocks, users, sessions
- functions `DeleteAllBlocks` and `DeleteAllUsers` added to `Store` interface
- new functions implemented for `SQLStore`
* Cypress tests (initial version) for login actions added:
- redirect to login page,
- register user,
- test for loading home page deleted,
- allow js in `tsconfig.json` for cypress tests.
* Cypress tests for login actions:
- check that main page with workspace is visible after registration,
- initial version of test for login of register user.
* Cypress tests for login actions:
- function for checking that workspace is available added,
- functions for login and logout added,
- test for password change added,
- session parameters added to server config for cypress testing.
* Switch Cypress tests to typescript.
* Use ids for inputs instead of placeholder text.
* Use cypress request for login without loading login page.
* Cypress custom command for login added.
* Cypress tests fixed:
- new cypress commands for server reset, register/login user
- single test for "create and delete board/card"
- fixes for `BoardPage` component useEffect callbacks
- npm script `runserver-test` doesn't use single user mode
* Deletion of all blocks changed:
- also deletes blocks from history
- public function renamed to DeleteAllBlocksPermanently
- code for mocks and public methods generated
* Server tests for files fixed on windows.
* Cypress tests for the registration of second user via invite link added.
* Added `baseUrl` in main `tsconfig.json` (required by cypress configuration).
* Cypress test fixed. Comments as well as log messages added.
* Log a message if testing API is enabled.
* Single cypress test for register/login actions.
* Revert changes to server.
* More convenient cypress commands:
- all API calls made as separate commands
- declarations for commands moved to separate global.d.ts file
- utility functions moved after test actions in 'Login actions' test
2021-11-22 17:59:01 +02:00
|
|
|
...headers(),
|
|
|
|
body,
|
|
|
|
})
|
|
|
|
})
|
2021-12-15 18:57:58 +02:00
|
|
|
|
|
|
|
Cypress.Commands.add('uiCreateNewBoard', (title?: string) => {
|
|
|
|
cy.log('**Create new empty board**')
|
2022-03-24 19:24:18 +02:00
|
|
|
cy.uiCreateEmptyBoard()
|
|
|
|
|
2022-06-16 13:17:44 +02:00
|
|
|
cy.findByPlaceholderText('Untitled board').should('exist')
|
2022-02-02 10:38:57 +02:00
|
|
|
cy.wait(10)
|
2021-12-15 18:57:58 +02:00
|
|
|
if (title) {
|
|
|
|
cy.log('**Rename board**')
|
2022-06-16 13:17:44 +02:00
|
|
|
cy.findByPlaceholderText('Untitled board').type(`${title}{enter}`)
|
2021-12-15 18:57:58 +02:00
|
|
|
cy.findByRole('textbox', {name: title}).should('exist')
|
|
|
|
}
|
2022-01-07 20:58:28 +02:00
|
|
|
cy.wait(500)
|
2021-12-15 18:57:58 +02:00
|
|
|
})
|
|
|
|
|
|
|
|
Cypress.Commands.add('uiAddNewGroup', (name?: string) => {
|
|
|
|
cy.log('**Add a new group**')
|
|
|
|
cy.findByRole('button', {name: '+ Add a group'}).click()
|
|
|
|
cy.findByRole('textbox', {name: 'New group'}).should('exist')
|
|
|
|
|
|
|
|
if (name) {
|
|
|
|
cy.log('**Rename group**')
|
|
|
|
cy.findByRole('textbox', {name: 'New group'}).type(`{selectall}${name}{enter}`)
|
|
|
|
cy.findByRole('textbox', {name}).should('exist')
|
|
|
|
}
|
2022-01-07 20:58:28 +02:00
|
|
|
cy.wait(500)
|
2021-12-15 18:57:58 +02:00
|
|
|
})
|
2022-01-13 18:26:27 +02:00
|
|
|
|
|
|
|
Cypress.Commands.add('uiAddNewCard', (title?: string, columnIndex?: number) => {
|
|
|
|
cy.log('**Add a new card**')
|
|
|
|
cy.findByRole('button', {name: '+ New'}).eq(columnIndex || 0).click()
|
|
|
|
cy.findByRole('dialog').should('exist')
|
|
|
|
|
|
|
|
if (title) {
|
|
|
|
cy.log('**Change card title**')
|
|
|
|
cy.findByPlaceholderText('Untitled').type(title)
|
|
|
|
}
|
|
|
|
})
|