Я хочу создать функцию, чтобы избежать повторения кода на Cypress.
Задача:
Мне нужно войти в систему с разными типами пользователей (с разными разрешениями) и я хочу проверить, какой тип пользователя получает ошибку «403 Forbidden» на желаемом пути. Поскольку у меня 6 типов пользователей и 11 разных путей, приведенный ниже код повторяется для каждого отдельного пользователя / пути, что меня не устраивает.
cy.visit('/abc')
.get('[data-qa = "http-error.section"]')
.should('exist')
.contains('403')
.visit('/def')
.get('[data-qa = "http-error.section"]')
.should('exist')
.contains('403')
.get('[data-qa = "logout"]')
.click()
Как я могу создать функцию, например check403 (), и реализовать в ней набор элементов управления? Чтобы код выглядел так:
cy.visit('/abc')
.check403()
.visit('/def')
.check403()
.get('[data-qa = "logout"]')
.click()
Если я смогу создать что-то подобное, я смогу удалить огромное количество повторяющегося кода.
Что я пробовал:
cy.check403(), но затем у меня возникла ошибка cy.check403() is not a function на Cypress.Обновлять
Я определил всех пользователей внутри users.json в папке fixtures.
Я вхожу в систему с каждым пользователем отдельно, а остальное делаю.
Мой код находится под afterlogin.spec.js.
Вот полный код, но он слишком длинный, чтобы выполнить такую простую задачу. Может, поможет:
it('Unauthorized users are redirected to a 403 page', () => {
cy.fixture('users.json').then(users => {
cy.login(
users[Cypress.env('ENVIRONMENT')].driver,
Cypress.env('DEFAULT_USER_PASSWORD')
).then(response => {
cy.setCookie('__bl_pp__', response.body.result.access_token)
.visit('/me')
.get('[data-qa = "roles"]')
.contains('driver')
.visit('/offers')
.get('[data-qa = "http-error.section"]')
.should('exist')
.contains('403')
.get('[data-qa = "back-to-homepage"]')
.should('exist')
.visit('/drivers')
.get('[data-qa = "http-error.section"]')
.should('exist')
.contains('403')
.get('[data-qa = "logout"]')
.click()
cy.login(
users[Cypress.env('ENVIRONMENT')].dispatcher,
Cypress.env('DEFAULT_USER_PASSWORD')
).then(response => {
cy.setCookie('__bl_pp__', response.body.result.access_token)
.visit('/me')
.get('[data-qa = "roles"]')
.contains('dispatcher')
.visit('/offers')
.get('[data-qa = "http-error.section"]')
.should('exist')
.contains('403')
.get('[data-qa = "logout"]')
.click()
cy.login(
users[Cypress.env('ENVIRONMENT')].provider,
Cypress.env('DEFAULT_USER_PASSWORD')
).then(response => {
cy.setCookie('__bl_pp__', response.body.result.access_token)
.visit('/me')
.get('[data-qa = "roles"]')
.contains('provider')
.visit('/planned')
.get('[data-qa = "http-error.section"]')
.should('exist')
.contains('403')
.visit('/finished')
.get('[data-qa = "http-error.section"]')
.should('exist')
.contains('403')
.get('[data-qa = "logout"]')
.click()
cy.login(
users[Cypress.env('ENVIRONMENT')].reviewer,
Cypress.env('DEFAULT_USER_PASSWORD')
).then(response => {
cy.setCookie('__bl_pp__', response.body.result.access_token)
.visit('/me')
.get('[data-qa = "roles"]')
.contains('reviewer')
.visit('/offers')
.get('[data-qa = "http-error.section"]')
.should('exist')
.contains('403')
.visit('/planned')
.get('[data-qa = "http-error.section"]')
.should('exist')
.contains('403')
.get('[data-qa = "logout"]')
.click()
cy.login(
users[Cypress.env('ENVIRONMENT')].admin,
Cypress.env('DEFAULT_USER_PASSWORD')
).then(response => {
cy.setCookie('__bl_pp__', response.body.result.access_token)
.visit('/me')
.get('[data-qa = "roles"]')
.contains('admin')
.visit('/offers')
.get('[data-qa = "http-error.section"]')
.should('exist')
.contains('403')
.visit('/planned')
.get('[data-qa = "http-error.section"]')
.should('exist')
.contains('403')
.visit('/finished')
.get('[data-qa = "http-error.section"]')
.should('exist')
.contains('403')
.get('[data-qa = "logout"]')
.click()
})
})
})
})
})
})



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете добиться этого с помощью специальной команды. Вы сказали, что попробовали один, и это не сработало, но я успешно делаю нечто подобное в своих тестах.
Cypress.Commands.add("check403", () => {
cy.get('[data-qa = "http-error.section"]')
.should('exist')
.should('contain', '403'); // I changed this - you didn't mention that it
// didn't work, but it would have been returning an element, not asserting
});
Я перезапущу свой код и сообщу вам об ошибке. Думаю, я не вернул элемент. Вероятно, это была ошибка.
Не уверен на 100%, где пользователи и пути подходят в показанном коде, но вы можете повторить тест, например, с помощью простого цикла javascript.
const users = ['Joe', 'Jim', 'John']
const paths = ['Add', 'Edit', 'Remove']
users.forEach(user => {
paths.forEach(path => {
it(`should test user '${user}' and path '${path}'`, => {
// test code here
})
})
})
Может быть, это,
const roles = ['driver', 'dispatcher', 'provider', 'reviewer', 'admin'];
context('Unauthorized users are redirected to a 403 page', () => {
cy.fixture('users.json').then(users => {
const user = users[Cypress.env('ENVIRONMENT')];
roles.forEach(role => {
it(`testing user '${user}' and role '${role}'`, () => {
cy.login(user[role], Cypress.env('DEFAULT_USER_PASSWORD'))
.then(response => {
cy.setCookie('__bl_pp__', response.body.result.access_token);
cy.visit('/me').get('[data-qa = "roles"]').contains(role);
cy.visit('/offers').get('[data-qa = "http-error.section"]')
.should('exist').contains('403')
.get('[data-qa = "back-to-homepage"]').should('exist')
cy.visit('/drivers').get('[data-qa = "http-error.section"]')
.should('exist').contains('403')
.get('[data-qa = "logout"]').click()
})
})
})
Я обновил и добавил полный код. Я бы хотел реализовать что-то подобное, но поскольку мне нужно входить в систему с ними отдельно, я не могу представить, как правильно реализовать тот, который вы написали.
Можете ли вы опубликовать ошибку, которую вы получили, когда пользовательская команда не работала?