diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 98bb044..8eb6934 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -24,7 +24,6 @@ deploy-to-staging: - if: "$CI_COMMIT_BRANCH == $STAGING_BRANCH" extends: .deploy_template - deploy-to-prod: tags: - front diff --git a/README.md b/README.md index a4afb11..d85c266 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# pena_hub_admin_front \ No newline at end of file +# pena_hub_admin_front diff --git a/babel.config.js b/babel.config.js index dd242dc..267b543 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,6 +1,3 @@ module.exports = { - presets: [ - ["@babel/preset-env", { targets: { node: "current" } }], - "@babel/preset-typescript", - ], + presets: [["@babel/preset-env", { targets: { node: "current" } }], "@babel/preset-typescript"], }; diff --git a/craco.config.js b/craco.config.js index fa1bc01..c5cd998 100644 --- a/craco.config.js +++ b/craco.config.js @@ -1,17 +1,17 @@ const CracoAlias = require("craco-alias"); module.exports = { - plugins: [ - { - plugin: CracoAlias, - options: { - source: "tsconfig", - // baseUrl SHOULD be specified - // plugin does not take it from tsconfig - baseUrl: "./src", - // tsConfigPath should point to the file where "baseUrl" and "paths" are specified - tsConfigPath: "./tsconfig.extend.json" - } - } - ] -}; \ No newline at end of file + plugins: [ + { + plugin: CracoAlias, + options: { + source: "tsconfig", + // baseUrl SHOULD be specified + // plugin does not take it from tsconfig + baseUrl: "./src", + // tsConfigPath should point to the file where "baseUrl" and "paths" are specified + tsConfigPath: "./tsconfig.extend.json", + }, + }, + ], +}; diff --git a/cypress.config.ts b/cypress.config.ts index a43fe1b..8585a4d 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -1,11 +1,11 @@ import { defineConfig } from "cypress"; export default defineConfig({ - e2e: { - viewportWidth: 1200, - viewportHeight: 800, - fixturesFolder: "tests/e2e/fixtures", - supportFile: false, - defaultCommandTimeout: 100, - }, + e2e: { + viewportWidth: 1200, + viewportHeight: 800, + fixturesFolder: "tests/e2e/fixtures", + supportFile: false, + defaultCommandTimeout: 100, + }, }); diff --git a/cypress/e2e/access.cy.ts b/cypress/e2e/access.cy.ts index 9ad87fa..3e2ba88 100644 --- a/cypress/e2e/access.cy.ts +++ b/cypress/e2e/access.cy.ts @@ -1,110 +1,110 @@ describe("Форма Входа", () => { - beforeEach(() => { - cy.visit("http://localhost:3000"); - }); + beforeEach(() => { + cy.visit("http://localhost:3000"); + }); - it("должна успешно входить с правильными учетными данными", () => { - const email = "valid_user@example.com"; - const password = "valid_password"; + it("должна успешно входить с правильными учетными данными", () => { + const email = "valid_user@example.com"; + const password = "valid_password"; - cy.get('input[name="email"]').type(email); - cy.get('input[name="password"]').type(password); - cy.get('button[type="submit"]').click(); + cy.get('input[name="email"]').type(email); + cy.get('input[name="password"]').type(password); + cy.get('button[type="submit"]').click(); - cy.url().should("include", "http://localhost:3000/users"); - }); + cy.url().should("include", "http://localhost:3000/users"); + }); - it("должна отображать сообщение об ошибке при неверном формате электронной почты", () => { - const invalidEmail = "invalid_email"; + it("должна отображать сообщение об ошибке при неверном формате электронной почты", () => { + const invalidEmail = "invalid_email"; - cy.get('input[name="email"]').type(invalidEmail); - cy.get('input[name="password"]').type("valid_password"); - cy.get('button[type="submit"]').click(); + cy.get('input[name="email"]').type(invalidEmail); + cy.get('input[name="password"]').type("valid_password"); + cy.get('button[type="submit"]').click(); - cy.contains("Неверный формат эл. почты"); - }); + cy.contains("Неверный формат эл. почты"); + }); - it("должна отображать сообщение об ошибке при отсутствии пароля", () => { - cy.get('input[name="email"]').type("valid_email@example.com"); - cy.get('button[type="submit"]').click(); + it("должна отображать сообщение об ошибке при отсутствии пароля", () => { + cy.get('input[name="email"]').type("valid_email@example.com"); + cy.get('button[type="submit"]').click(); - cy.contains("Введите пароль"); - }); + cy.contains("Введите пароль"); + }); - it("должна отображать сообщение об ошибке для недопустимого пароля", () => { - const invalidPassword = "short"; + it("должна отображать сообщение об ошибке для недопустимого пароля", () => { + const invalidPassword = "short"; - cy.get('input[name="email"]').type("valid_email@example.com"); - cy.get('input[name="password"]').type(invalidPassword); - cy.get('button[type="submit"]').click(); + cy.get('input[name="email"]').type("valid_email@example.com"); + cy.get('input[name="password"]').type(invalidPassword); + cy.get('button[type="submit"]').click(); - cy.contains("Invalid password"); - }); + cy.contains("Invalid password"); + }); }); describe("Форма регистрации", () => { - beforeEach(() => { - cy.visit("http://localhost:3000/signup"); - }); + beforeEach(() => { + cy.visit("http://localhost:3000/signup"); + }); - it("должна регистрировать нового пользователя с правильными данными", () => { - const email = Cypress._.random(1000) + "@example.com"; - const password = "valid_password"; + it("должна регистрировать нового пользователя с правильными данными", () => { + const email = Cypress._.random(1000) + "@example.com"; + const password = "valid_password"; - cy.get('input[name="email"]').type(email); - cy.get('input[name="password"]').type(password); - cy.get('input[name="repeatPassword"]').type(password); + cy.get('input[name="email"]').type(email); + cy.get('input[name="password"]').type(password); + cy.get('input[name="repeatPassword"]').type(password); - cy.get('button[type="submit"]').click(); - cy.wait(5000); + cy.get('button[type="submit"]').click(); + cy.wait(5000); - cy.url().should("include", "http://localhost:3000/users"); - }); + cy.url().should("include", "http://localhost:3000/users"); + }); - it("должна отображать ошибку при неверном формате электронной почты", () => { - const invalidEmail = "invalid_email"; + it("должна отображать ошибку при неверном формате электронной почты", () => { + const invalidEmail = "invalid_email"; - cy.get('input[name="email"]').type(invalidEmail); - cy.get('input[name="password"]').type("valid_password"); - cy.get('input[name="repeatPassword"]').type("valid_password"); + cy.get('input[name="email"]').type(invalidEmail); + cy.get('input[name="password"]').type("valid_password"); + cy.get('input[name="repeatPassword"]').type("valid_password"); - cy.get('button[type="submit"]').click(); + cy.get('button[type="submit"]').click(); - cy.contains("Неверный формат эл. почты"); - }); + cy.contains("Неверный формат эл. почты"); + }); - it("должна отображать ошибку при отсутствии пароля", () => { - cy.get('input[name="email"]').type("valid_email@example.com"); - cy.get('input[name="repeatPassword"]').type("valid_password"); + it("должна отображать ошибку при отсутствии пароля", () => { + cy.get('input[name="email"]').type("valid_email@example.com"); + cy.get('input[name="repeatPassword"]').type("valid_password"); - cy.get('button[type="submit"]').click(); + cy.get('button[type="submit"]').click(); - cy.contains("Обязательное поле").should("have.length", 1); - }); + cy.contains("Обязательное поле").should("have.length", 1); + }); - it("должна отображать ошибку при несовпадении паролей", () => { - cy.get('input[name="email"]').type("valid_email@example.com"); - cy.get('input[name="password"]').type("valid_password"); - cy.get('input[name="repeatPassword"]').type("different_password"); + it("должна отображать ошибку при несовпадении паролей", () => { + cy.get('input[name="email"]').type("valid_email@example.com"); + cy.get('input[name="password"]').type("valid_password"); + cy.get('input[name="repeatPassword"]').type("different_password"); - cy.get('button[type="submit"]').click(); + cy.get('button[type="submit"]').click(); - cy.contains("Пароли не совпадают"); - }); + cy.contains("Пароли не совпадают"); + }); - it("попытка отправки запроса при уже зарегистрированном пользователе", () => { - const email = "users@gmail.com"; - const password = "12344321"; + it("попытка отправки запроса при уже зарегистрированном пользователе", () => { + const email = "users@gmail.com"; + const password = "12344321"; - cy.get('input[name="email"]').type(email); - cy.get('input[name="password"]').type(password); - cy.get('input[name="repeatPassword"]').type(password); + cy.get('input[name="email"]').type(email); + cy.get('input[name="password"]').type(password); + cy.get('input[name="repeatPassword"]').type(password); - cy.intercept("POST", process.env.REACT_APP_DOMAIN + "/auth/register").as("registerRequest"); - cy.get('button[type="submit"]').click(); - cy.wait("@registerRequest"); + cy.intercept("POST", process.env.REACT_APP_DOMAIN + "/auth/register").as("registerRequest"); + cy.get('button[type="submit"]').click(); + cy.wait("@registerRequest"); - cy.wait(5000); - cy.contains("user with this login is exist"); - }); + cy.wait(5000); + cy.contains("user with this login is exist"); + }); }); diff --git a/cypress/e2e/tariffs.cy.ts b/cypress/e2e/tariffs.cy.ts index a9c7c5a..570728c 100644 --- a/cypress/e2e/tariffs.cy.ts +++ b/cypress/e2e/tariffs.cy.ts @@ -1,246 +1,246 @@ describe("Форма Создания Тарифа", () => { - beforeEach(() => { - cy.visit("http://localhost:3000"); - cy.get('input[name="email"]').type("valid_user@example.com"); - cy.get('input[name="password"]').type("valid_password"); - cy.get('button[type="submit"]').click(); - cy.wait(3000); - cy.url().should("include", "http://localhost:3000/users"); - cy.visit("http://localhost:3000/tariffs"); - }); + beforeEach(() => { + cy.visit("http://localhost:3000"); + cy.get('input[name="email"]').type("valid_user@example.com"); + cy.get('input[name="password"]').type("valid_password"); + cy.get('button[type="submit"]').click(); + cy.wait(3000); + cy.url().should("include", "http://localhost:3000/users"); + cy.visit("http://localhost:3000/tariffs"); + }); - it("должна отображать сообщение об ошибке при пустом названии тарифа", () => { - cy.get('input[id="tariff-amount"]').type("10"); + it("должна отображать сообщение об ошибке при пустом названии тарифа", () => { + cy.get('input[id="tariff-amount"]').type("10"); - // Выбрать первую привилегию с нужным текстом из выпадающего списка - cy.get("#privilege-select").click(); + // Выбрать первую привилегию с нужным текстом из выпадающего списка + cy.get("#privilege-select").click(); - cy.get(`[data-cy = "select-option-Количество шаблонов, которые может сделать пользователь сервиса"]`).click(); + cy.get(`[data-cy = "select-option-Количество шаблонов, которые может сделать пользователь сервиса"]`).click(); - cy.get(".btn_createTariffBackend").click({ force: true }); + cy.get(".btn_createTariffBackend").click({ force: true }); - cy.contains("Пустое название тарифа"); - }); + cy.contains("Пустое название тарифа"); + }); - it("должна отображать сообщение об ошибке при отсутствии выбора привилегии", () => { - cy.get('input[id="tariff-name"]').type("Тестовый Тариф"); - cy.get('input[id="tariff-amount"]').type("10"); + it("должна отображать сообщение об ошибке при отсутствии выбора привилегии", () => { + cy.get('input[id="tariff-name"]').type("Тестовый Тариф"); + cy.get('input[id="tariff-amount"]').type("10"); - cy.get(".btn_createTariffBackend").click({ force: true }); + cy.get(".btn_createTariffBackend").click({ force: true }); - cy.contains("Не выбрана привилегия"); - }); + cy.contains("Не выбрана привилегия"); + }); - it("Создание трех тарифов", () => { - cy.get('input[id="tariff-name"]').type("Тестовый Тариф 1"); - cy.get('input[id="tariff-amount"]').type("10"); - cy.get("#privilege-select").click(); - cy.get(`[data-cy="select-option-Количество шаблонов, которые может сделать пользователь сервиса"]`).click(); - cy.get(".btn_createTariffBackend").click({ force: true }); + it("Создание трех тарифов", () => { + cy.get('input[id="tariff-name"]').type("Тестовый Тариф 1"); + cy.get('input[id="tariff-amount"]').type("10"); + cy.get("#privilege-select").click(); + cy.get(`[data-cy="select-option-Количество шаблонов, которые может сделать пользователь сервиса"]`).click(); + cy.get(".btn_createTariffBackend").click({ force: true }); - cy.get('input[id="tariff-name"]').scrollIntoView().clear({ force: true }).type("Тестовый Тариф 2"); - cy.get('input[id="tariff-amount"]').scrollIntoView().clear({ force: true }).type("15"); - cy.get("#privilege-select").click(); - cy.wait(800); - cy.get(`[data-cy="select-option-Количество дней, в течении которых пользование сервисом безлимитно"]`).click(); - cy.get(".btn_createTariffBackend").click({ force: true }); + cy.get('input[id="tariff-name"]').scrollIntoView().clear({ force: true }).type("Тестовый Тариф 2"); + cy.get('input[id="tariff-amount"]').scrollIntoView().clear({ force: true }).type("15"); + cy.get("#privilege-select").click(); + cy.wait(800); + cy.get(`[data-cy="select-option-Количество дней, в течении которых пользование сервисом безлимитно"]`).click(); + cy.get(".btn_createTariffBackend").click({ force: true }); - cy.get('input[id="tariff-name"]').scrollIntoView().clear({ force: true }).type("Тестовый Тариф 3"); - cy.get('input[id="tariff-amount"]').scrollIntoView().clear({ force: true }).type("20"); - cy.get("#privilege-select").click(); - cy.wait(800); - cy.get(`[data-cy="select-option-Обьём ПенаДиска для хранения шаблонов и результатов шаблонизации"]`).click(); - cy.get(".btn_createTariffBackend").click({ force: true }); + cy.get('input[id="tariff-name"]').scrollIntoView().clear({ force: true }).type("Тестовый Тариф 3"); + cy.get('input[id="tariff-amount"]').scrollIntoView().clear({ force: true }).type("20"); + cy.get("#privilege-select").click(); + cy.wait(800); + cy.get(`[data-cy="select-option-Обьём ПенаДиска для хранения шаблонов и результатов шаблонизации"]`).click(); + cy.get(".btn_createTariffBackend").click({ force: true }); - cy.wait(5000); - }); + cy.wait(5000); + }); }); describe("Форма Создания Тарифа", () => { - beforeEach(() => { - cy.visit("http://localhost:3000"); - cy.get('input[name="email"]').type("valid_user@example.com"); - cy.get('input[name="password"]').type("valid_password"); - cy.get('button[type="submit"]').click(); - cy.wait(3000); - cy.url().should("include", "http://localhost:3000/users"); - cy.visit("http://localhost:3000/tariffs"); - }); + beforeEach(() => { + cy.visit("http://localhost:3000"); + cy.get('input[name="email"]').type("valid_user@example.com"); + cy.get('input[name="password"]').type("valid_password"); + cy.get('button[type="submit"]').click(); + cy.wait(3000); + cy.url().should("include", "http://localhost:3000/users"); + cy.visit("http://localhost:3000/tariffs"); + }); - it("Удаление тарифа единично, одного за другим ", () => { - const tariffNamesToFind = ["Тестовый Тариф 1", "Тестовый Тариф 2", "Тестовый Тариф 3"]; + it("Удаление тарифа единично, одного за другим ", () => { + const tariffNamesToFind = ["Тестовый Тариф 1", "Тестовый Тариф 2", "Тестовый Тариф 3"]; - // Поиск каждого тарифа в DataGrid - cy.wait(3000); - tariffNamesToFind.forEach((tariffName) => { - cy.get(".tariffs-data-grid").scrollIntoView().contains(tariffName).should("be.visible"); - }); + // Поиск каждого тарифа в DataGrid + cy.wait(3000); + tariffNamesToFind.forEach((tariffName) => { + cy.get(".tariffs-data-grid").scrollIntoView().contains(tariffName).should("be.visible"); + }); - const deleteTariffs = () => { - let tariffsFound = true; + const deleteTariffs = () => { + let tariffsFound = true; - cy.get(".tariffs-data-grid .MuiDataGrid-row").then(($rows) => { - const rowCount = $rows.length; + cy.get(".tariffs-data-grid .MuiDataGrid-row").then(($rows) => { + const rowCount = $rows.length; - if (rowCount === 1) { - cy.log("Тарифы не найдены. Тест завершен."); - tariffsFound = false; - } + if (rowCount === 1) { + cy.log("Тарифы не найдены. Тест завершен."); + tariffsFound = false; + } - cy.wrap($rows).each(($row) => { - // Шаг 2: В каждом элементе найдите все дивы вложенные внутрь и выберите последний див - cy.wrap($row).find("div").last().scrollIntoView().get(".delete-tariff-button").last().click({ force: true }); - }); + cy.wrap($rows).each(($row) => { + // Шаг 2: В каждом элементе найдите все дивы вложенные внутрь и выберите последний див + cy.wrap($row).find("div").last().scrollIntoView().get(".delete-tariff-button").last().click({ force: true }); + }); - cy.wait(2000); - cy.contains("Да") - .click() - .then(() => { - if (!tariffsFound) { - return; - } + cy.wait(2000); + cy.contains("Да") + .click() + .then(() => { + if (!tariffsFound) { + return; + } - cy.wait(5000); - deleteTariffs(); - }); - }); - }; + cy.wait(5000); + deleteTariffs(); + }); + }); + }; - deleteTariffs(); + deleteTariffs(); - // Проверяем что Дата грид тарифов пустой - cy.wait(2000); - cy.get(".tariffs-data-grid .MuiDataGrid-row").should("not.exist"); - }); + // Проверяем что Дата грид тарифов пустой + cy.wait(2000); + cy.get(".tariffs-data-grid .MuiDataGrid-row").should("not.exist"); + }); - it("Удаление тарифов массово через DataGrid", () => { - // Добавляем 3 тариффа - cy.get('input[id="tariff-name"]').type("Тестовый Тариф 1"); - cy.get('input[id="tariff-amount"]').type("10"); - cy.get("#privilege-select").click(); - cy.get(`[data-cy="select-option-Количество шаблонов, которые может сделать пользователь сервиса"]`).click(); - cy.get(".btn_createTariffBackend").click({ force: true }); + it("Удаление тарифов массово через DataGrid", () => { + // Добавляем 3 тариффа + cy.get('input[id="tariff-name"]').type("Тестовый Тариф 1"); + cy.get('input[id="tariff-amount"]').type("10"); + cy.get("#privilege-select").click(); + cy.get(`[data-cy="select-option-Количество шаблонов, которые может сделать пользователь сервиса"]`).click(); + cy.get(".btn_createTariffBackend").click({ force: true }); - cy.get('input[id="tariff-name"]').scrollIntoView().clear({ force: true }).type("Тестовый Тариф 2"); - cy.get('input[id="tariff-amount"]').scrollIntoView().clear({ force: true }).type("15"); - cy.get("#privilege-select").click(); - cy.wait(800); - cy.get(`[data-cy="select-option-Количество дней, в течении которых пользование сервисом безлимитно"]`).click(); - cy.get(".btn_createTariffBackend").click({ force: true }); + cy.get('input[id="tariff-name"]').scrollIntoView().clear({ force: true }).type("Тестовый Тариф 2"); + cy.get('input[id="tariff-amount"]').scrollIntoView().clear({ force: true }).type("15"); + cy.get("#privilege-select").click(); + cy.wait(800); + cy.get(`[data-cy="select-option-Количество дней, в течении которых пользование сервисом безлимитно"]`).click(); + cy.get(".btn_createTariffBackend").click({ force: true }); - cy.get('input[id="tariff-name"]').scrollIntoView().clear({ force: true }).type("Тестовый Тариф 3"); - cy.get('input[id="tariff-amount"]').scrollIntoView().clear({ force: true }).type("20"); - cy.get("#privilege-select").click(); - cy.wait(800); - cy.get(`[data-cy="select-option-Обьём ПенаДиска для хранения шаблонов и результатов шаблонизации"]`).click(); - cy.get(".btn_createTariffBackend").click({ force: true }); - // Добавляем 3 тариффа + cy.get('input[id="tariff-name"]').scrollIntoView().clear({ force: true }).type("Тестовый Тариф 3"); + cy.get('input[id="tariff-amount"]').scrollIntoView().clear({ force: true }).type("20"); + cy.get("#privilege-select").click(); + cy.wait(800); + cy.get(`[data-cy="select-option-Обьём ПенаДиска для хранения шаблонов и результатов шаблонизации"]`).click(); + cy.get(".btn_createTariffBackend").click({ force: true }); + // Добавляем 3 тариффа - cy.wait(3000); - cy.get(".tariffs-data-grid .PrivateSwitchBase-input").first().click({ multiple: true }); + cy.wait(3000); + cy.get(".tariffs-data-grid .PrivateSwitchBase-input").first().click({ multiple: true }); - // Проверить, что кнопка "Удалить" появилась - cy.wait(2000); - cy.contains("Удаление").should("be.visible"); + // Проверить, что кнопка "Удалить" появилась + cy.wait(2000); + cy.contains("Удаление").should("be.visible"); - // Нажать на кнопку "Удалить" - cy.contains("Удаление").click(); + // Нажать на кнопку "Удалить" + cy.contains("Удаление").click(); - // Подтверждение удаления (если нужно) - cy.contains("Да").click(); + // Подтверждение удаления (если нужно) + cy.contains("Да").click(); - // Проверяем что Дата грид тарифов пустой - cy.wait(2000); - cy.get(".tariffs-data-grid .MuiDataGrid-row").should("not.exist"); - }); + // Проверяем что Дата грид тарифов пустой + cy.wait(2000); + cy.get(".tariffs-data-grid .MuiDataGrid-row").should("not.exist"); + }); - it("Добавление тарифом в корзину", () => { - // Добавляем 3 тариффа + it("Добавление тарифом в корзину", () => { + // Добавляем 3 тариффа - cy.get('input[id="tariff-name"]').type("Тестовый Тариф 1"); - cy.get('input[id="tariff-amount"]').type("10"); - cy.get("#privilege-select").click(); - cy.get(`[data-cy="select-option-Количество шаблонов, которые может сделать пользователь сервиса"]`).click(); - cy.get(".btn_createTariffBackend").click({ force: true }); + cy.get('input[id="tariff-name"]').type("Тестовый Тариф 1"); + cy.get('input[id="tariff-amount"]').type("10"); + cy.get("#privilege-select").click(); + cy.get(`[data-cy="select-option-Количество шаблонов, которые может сделать пользователь сервиса"]`).click(); + cy.get(".btn_createTariffBackend").click({ force: true }); - cy.get('input[id="tariff-name"]').scrollIntoView().clear({ force: true }).type("Тестовый Тариф 2"); - cy.get('input[id="tariff-amount"]').scrollIntoView().clear({ force: true }).type("15"); - cy.get("#privilege-select").click(); - cy.wait(800); - cy.get(`[data-cy="select-option-Количество дней, в течении которых пользование сервисом безлимитно"]`).click(); - cy.get(".btn_createTariffBackend").click({ force: true }); + cy.get('input[id="tariff-name"]').scrollIntoView().clear({ force: true }).type("Тестовый Тариф 2"); + cy.get('input[id="tariff-amount"]').scrollIntoView().clear({ force: true }).type("15"); + cy.get("#privilege-select").click(); + cy.wait(800); + cy.get(`[data-cy="select-option-Количество дней, в течении которых пользование сервисом безлимитно"]`).click(); + cy.get(".btn_createTariffBackend").click({ force: true }); - cy.get('input[id="tariff-name"]').scrollIntoView().clear({ force: true }).type("Тестовый Тариф 3"); - cy.get('input[id="tariff-amount"]').scrollIntoView().clear({ force: true }).type("20"); - cy.get("#privilege-select").click(); - cy.wait(800); - cy.get(`[data-cy="select-option-Обьём ПенаДиска для хранения шаблонов и результатов шаблонизации"]`).click(); - cy.get(".btn_createTariffBackend").click({ force: true }); - // Добавляем 3 тариффа + cy.get('input[id="tariff-name"]').scrollIntoView().clear({ force: true }).type("Тестовый Тариф 3"); + cy.get('input[id="tariff-amount"]').scrollIntoView().clear({ force: true }).type("20"); + cy.get("#privilege-select").click(); + cy.wait(800); + cy.get(`[data-cy="select-option-Обьём ПенаДиска для хранения шаблонов и результатов шаблонизации"]`).click(); + cy.get(".btn_createTariffBackend").click({ force: true }); + // Добавляем 3 тариффа - cy.wait(3000); - cy.get(".tariffs-data-grid .PrivateSwitchBase-input").first().click({ multiple: true }); + cy.wait(3000); + cy.get(".tariffs-data-grid .PrivateSwitchBase-input").first().click({ multiple: true }); - // Проверить, что кнопка "Удалить" появилась - cy.wait(2000); - cy.contains("рассчитать").should("be.visible"); + // Проверить, что кнопка "Удалить" появилась + cy.wait(2000); + cy.contains("рассчитать").should("be.visible"); - // Нажать на кнопку "Удалить" - cy.contains("рассчитать").click(); + // Нажать на кнопку "Удалить" + cy.contains("рассчитать").click(); - // смотрим что в корзине ровно столько тарифом, сколько мы добовляли - cy.wait(5000); - cy.get(".MuiTable-root tbody tr").its("length").should("eq", 3); - }); + // смотрим что в корзине ровно столько тарифом, сколько мы добовляли + cy.wait(5000); + cy.get(".MuiTable-root tbody tr").its("length").should("eq", 3); + }); }); describe("Определение поведения кастомной цены тарифа", () => { - beforeEach(() => { - cy.visit("http://localhost:3000"); - cy.get('input[name="email"]').type("valid_user@example.com"); - cy.get('input[name="password"]').type("valid_password"); - cy.get('button[type="submit"]').click(); - cy.wait(3000); - cy.url().should("include", "http://localhost:3000/users"); - cy.visit("http://localhost:3000/tariffs"); - }); + beforeEach(() => { + cy.visit("http://localhost:3000"); + cy.get('input[name="email"]').type("valid_user@example.com"); + cy.get('input[name="password"]').type("valid_password"); + cy.get('button[type="submit"]').click(); + cy.wait(3000); + cy.url().should("include", "http://localhost:3000/users"); + cy.visit("http://localhost:3000/tariffs"); + }); - it("Смотрим чтобы при указание кастомной цены тарифа поля суммы и Цены за ед отображались верно", () => { - cy.get('input[id="tariff-name"]').type("Тестовый Тариф 1"); + it("Смотрим чтобы при указание кастомной цены тарифа поля суммы и Цены за ед отображались верно", () => { + cy.get('input[id="tariff-name"]').type("Тестовый Тариф 1"); - cy.get('input[id="tariff-amount"]').type("60"); - cy.get('input[id="tariff-custom-price"]').type("5"); + cy.get('input[id="tariff-amount"]').type("60"); + cy.get('input[id="tariff-custom-price"]').type("5"); - cy.get("#privilege-select").click(); + cy.get("#privilege-select").click(); - cy.get(`[data-cy="select-option-Количество шаблонов, которые может сделать пользователь сервиса"]`).click(); - cy.get(".btn_createTariffBackend").click({ force: true }); + cy.get(`[data-cy="select-option-Количество шаблонов, которые может сделать пользователь сервиса"]`).click(); + cy.get(".btn_createTariffBackend").click({ force: true }); - cy.wait(3000); + cy.wait(3000); - // Сумму - cy.get(".tariffs-data-grid").get(`[data-field="total"]`).contains("300"); + // Сумму + cy.get(".tariffs-data-grid").get(`[data-field="total"]`).contains("300"); - // Проверяем цену за ед - cy.get(".tariffs-data-grid").get(`[data-field="pricePerUnit"]`).contains("5"); - }); + // Проверяем цену за ед + cy.get(".tariffs-data-grid").get(`[data-field="pricePerUnit"]`).contains("5"); + }); - it("Проверка установки цены тарифа по умолчанию при отсутствии кастомной цены", () => { - cy.get('input[id="tariff-name"]').type("Тестовый Тариф 1"); + it("Проверка установки цены тарифа по умолчанию при отсутствии кастомной цены", () => { + cy.get('input[id="tariff-name"]').type("Тестовый Тариф 1"); - cy.get('input[id="tariff-amount"]').type("80"); + cy.get('input[id="tariff-amount"]').type("80"); - cy.get("#privilege-select").click(); + cy.get("#privilege-select").click(); - cy.get(`[data-cy="select-option-Количество шаблонов, которые может сделать пользователь сервиса"]`).click(); - cy.get(".btn_createTariffBackend").click({ force: true }); + cy.get(`[data-cy="select-option-Количество шаблонов, которые может сделать пользователь сервиса"]`).click(); + cy.get(".btn_createTariffBackend").click({ force: true }); - cy.wait(3000); + cy.wait(3000); - // Сумму - cy.get(".tariffs-data-grid").get(`[data-field="total"]`).contains("0.8"); + // Сумму + cy.get(".tariffs-data-grid").get(`[data-field="total"]`).contains("0.8"); - // Проверяем цену за ед - cy.get(".tariffs-data-grid").get(`[data-field="pricePerUnit"]`).contains("0.01"); - }); + // Проверяем цену за ед + cy.get(".tariffs-data-grid").get(`[data-field="pricePerUnit"]`).contains("0.01"); + }); }); diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..643d473 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,9 @@ +import eslint from "@eslint/js"; +import tseslint from "typescript-eslint"; + +export default tseslint.config(eslint.configs.recommended, ...tseslint.configs.recommended, { + rules: { + semi: "error", + "prefer-const": "error", + }, +}); diff --git a/jest.config.js b/jest.config.js index 3abcbd9..34a9dd8 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,5 +1,5 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: "ts-jest", - testEnvironment: "node", + preset: "ts-jest", + testEnvironment: "node", }; diff --git a/package.json b/package.json index 9ebd058..effac26 100644 --- a/package.json +++ b/package.json @@ -1,84 +1,83 @@ { - "name": "adminka", - "version": "0.1.0", - "private": true, - "dependencies": { - "@date-io/dayjs": "^2.15.0", - "@emotion/react": "^11.10.4", - "@emotion/styled": "^11.10.4", - "@frontend/kitui": "^1.0.82", - "@material-ui/pickers": "^3.3.10", - "@mui/icons-material": "^5.10.3", - "@mui/material": "^5.10.5", - "@mui/styled-engine-sc": "^5.10.3", - "@mui/x-data-grid": "^5.17.4", - "@mui/x-data-grid-generator": "^5.17.5", - "@mui/x-data-grid-premium": "^5.17.5", - "@mui/x-date-pickers": "^5.0.3", - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^13.3.0", - "@testing-library/user-event": "^13.5.0", - "@types/jest": "^27.5.2", - "@types/node": "^16.11.56", - "@types/react": "^18.0.18", - "@types/react-dom": "^18.0.6", - "@types/react-router-dom": "^5.3.3", - "axios": "^1.4.0", - "craco": "^0.0.3", - "cypress": "^12.17.2", - "date-fns": "^3.3.1", - "dayjs": "^1.11.5", - "formik": "^2.2.9", - "immer": "^10.0.2", - "moment": "^2.29.4", - "nanoid": "^4.0.1", - "notistack": "^3.0.1", - "numeral": "^2.0.6", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-error-boundary": "^4.0.13", - "react-numeral": "^1.1.1", - "react-router-dom": "^6.3.0", - "react-scripts": "^5.0.1", - "reconnecting-eventsource": "^1.6.2", - "start-server-and-test": "^2.0.0", - "styled-components": "^5.3.5", - "swr": "^2.2.5", - "typescript": "^4.8.2", - "use-debounce": "^9.0.4", - "web-vitals": "^2.1.4", - "zustand": "^4.3.8" - }, - "scripts": { - "start": "craco start", - "build": "craco build", - "test": "craco test --env=node --transformIgnorePatterns \"node_modules/(?!@frontend)/\"", - "test:cart": "craco test src/utils/calcCart --transformIgnorePatterns \"node_modules/(?!@frontend)/\"", - "test:cypress": "start-server-and-test start http://localhost:3000 cypress", - "cypress": "cypress open", - "eject": "craco eject", - "format": "prettier . --write" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "devDependencies": { - "craco-alias": "^3.0.1", - "prettier": "^3.2.5" - } + "name": "adminka", + "version": "0.1.0", + "private": true, + "type": "module", + "dependencies": { + "@date-io/dayjs": "^2.15.0", + "@emotion/react": "^11.10.4", + "@emotion/styled": "^11.10.4", + "@frontend/kitui": "^1.0.82", + "@material-ui/pickers": "^3.3.10", + "@mui/icons-material": "^5.10.3", + "@mui/material": "^5.10.5", + "@mui/styled-engine-sc": "^5.10.3", + "@mui/x-data-grid": "^5.17.4", + "@mui/x-data-grid-generator": "^5.17.5", + "@mui/x-data-grid-premium": "^5.17.5", + "@mui/x-date-pickers": "^5.0.3", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.3.0", + "@testing-library/user-event": "^13.5.0", + "@types/jest": "^27.5.2", + "@types/node": "^16.11.56", + "@types/react": "^18.0.18", + "@types/react-dom": "^18.0.6", + "@types/react-router-dom": "^5.3.3", + "axios": "^1.4.0", + "craco": "^0.0.3", + "cypress": "^12.17.2", + "date-fns": "^3.3.1", + "dayjs": "^1.11.5", + "formik": "^2.2.9", + "immer": "^10.0.2", + "moment": "^2.29.4", + "nanoid": "^4.0.1", + "notistack": "^3.0.1", + "numeral": "^2.0.6", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-error-boundary": "^4.0.13", + "react-numeral": "^1.1.1", + "react-router-dom": "^6.3.0", + "react-scripts": "^5.0.1", + "reconnecting-eventsource": "^1.6.2", + "start-server-and-test": "^2.0.0", + "styled-components": "^5.3.5", + "swr": "^2.2.5", + "typescript": "^4.8.2", + "use-debounce": "^9.0.4", + "web-vitals": "^2.1.4", + "zustand": "^4.3.8" + }, + "scripts": { + "start": "craco start", + "build": "craco build", + "test": "craco test --env=node --transformIgnorePatterns \"node_modules/(?!@frontend)/\"", + "test:cart": "craco test src/utils/calcCart --transformIgnorePatterns \"node_modules/(?!@frontend)/\"", + "test:cypress": "start-server-and-test start http://localhost:3000 cypress", + "cypress": "cypress open", + "eject": "craco eject", + "format": "prettier . --write", + "lint": "eslint ./src --fix" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@eslint/js": "^9.3.0", + "craco-alias": "^3.0.1", + "eslint": "^9.3.0", + "prettier": "^3.2.5", + "typescript-eslint": "^7.10.0" + } } diff --git a/public/fonts.css b/public/fonts.css index e8a043f..83b54d0 100644 --- a/public/fonts.css +++ b/public/fonts.css @@ -1,4 +1,6 @@ @font-face { - font-family: "GilroyRegular"; - src: local("GilroyRegular"), url(fonts/GilroyRegular.woff) format("woff"); -} \ No newline at end of file + font-family: "GilroyRegular"; + src: + local("GilroyRegular"), + url(fonts/GilroyRegular.woff) format("woff"); +} diff --git a/public/index.html b/public/index.html index 888d060..a08896c 100644 --- a/public/index.html +++ b/public/index.html @@ -1,22 +1,19 @@ - + -
- - - - - - - - - - -