есть id тарифа для прода
Some checks failed
Deploy / CreateImage (push) Failing after 11m59s
Deploy / DeployService (push) Has been cancelled

This commit is contained in:
Nastya 2025-06-18 00:23:50 +03:00
parent 5ad3a810ef
commit 25deb4a0f4
8 changed files with 824 additions and 62 deletions

@ -3,8 +3,23 @@ import { defineConfig } from "cypress";
export default defineConfig({
e2e: {
baseUrl: 'http://localhost:3000',
viewportWidth: 1440,
viewportHeight: 900,
supportFile: false,
viewportWidth: 1280,
viewportHeight: 720,
video: true,
screenshotOnRunFailure: true,
supportFile: 'cypress/support/e2e.ts',
defaultCommandTimeout: 10000,
pageLoadTimeout: 30000,
requestTimeout: 10000,
responseTimeout: 30000,
setupNodeEvents(on, config) {
// implement node event listeners here
},
},
component: {
devServer: {
framework: 'react',
bundler: 'vite',
},
},
});

@ -3,52 +3,73 @@
describe('Personalization Flow', () => {
beforeEach(() => {
// Логинимся перед каждым тестом
cy.login(); // Предполагается, что у вас есть команда для логина
cy.login();
});
it('should complete personalization flow and open link in new tab', () => {
// Переходим на страницу персонализации
cy.visit('/personalization');
// Ищем нужный квиз и нажимаем редактировать
cy.contains('Сочетание перестановки и размещения')
.parent()
.parent()
.contains('Редактировать')
.click();
// Выбираем пол (мужской)
cy.get('[data-testid="gender-male"]').click();
// Переходим на вкладку персонализации
cy.contains('Персонализация').click();
// Ждем загрузки данных
cy.get('.MuiSkeleton-root', { timeout: 30000 }).should('not.exist');
cy.wait(6000);
// Удаляем все существующие ссылки
cy.get('body').then(($body) => {
if ($body.find('.delete_aud').length > 0) {
// Пока есть кнопки удаления - удаляем ссылки
const deleteLinks = () => {
// Находим первую кнопку удаления и кликаем по ней
cy.get('.delete_aud').first().click();
// Подтверждаем удаление
cy.get('#delete_OK').click();
// Проверяем, остались ли еще кнопки удаления
cy.get('body').then(($body) => {
if ($body.find('.delete_aud').length > 0) {
deleteLinks();
}
});
};
deleteLinks();
}
});
// Выбираем пол (М)
cy.contains('М').click();
// Генерируем случайный возраст от 1 до 99
const randomAge = Math.floor(Math.random() * 99) + 1;
// Вводим возраст
cy.get('[data-testid="age-input"]')
cy.get('input[placeholder="Введите возраст"]')
.type(randomAge.toString())
.should('have.value', randomAge.toString());
// Нажимаем кнопку OK
cy.get('[data-testid="submit-button"]').click();
// Нажимаем кнопку Ок
cy.contains('Ок').click();
// Ждем появления скелетона загрузки
cy.get('[data-testid="loading-skeleton"]').should('be.visible');
// Ждем 3 минуты (в реальном тесте это будет быстрее из-за моков)
cy.wait(180000);
// Ждем появления кнопки копирования
cy.get('[data-testid="copy-button"]').should('be.visible');
// Копируем ссылку
cy.get('[data-testid="copy-button"]').click();
// Проверяем появление уведомления об успешном копировании
cy.contains('Ссылка успешно скопирована').should('be.visible');
// Получаем ссылку из буфера обмена
cy.window().then((win) => {
win.navigator.clipboard.readText().then((text) => {
// Открываем ссылку в новой вкладке
cy.window().then((win) => {
const newWindow = win.open(text, '_blank');
// Проверяем, что новая вкладка открылась
expect(newWindow).to.not.be.null;
});
// Ждем появления ссылки и получаем её текст
cy.get('.link', { timeout: 30000 })
.should('be.visible')
.invoke('text')
.then((text) => {
// Исправляем домен в ссылке
const url = new URL(text);
url.hostname = 's.hbpn.link';
const correctUrl = url.toString();
// Переходим на страницу по исправленной ссылке
cy.visit(correctUrl);
// Проверяем содержимое страницы
cy.contains('Сочетание перестановки и размещения').should('exist');
});
});
});
});

@ -0,0 +1,28 @@
/// <reference types="cypress" />
declare global {
namespace Cypress {
interface Chainable {
login(): Chainable<void>
}
}
}
Cypress.Commands.add('login', () => {
// Пробуем перейти на страницу входа
cy.visit('/signin', {
timeout: 10000, // Увеличиваем таймаут до 10 секунд
failOnStatusCode: false // Не падаем при ошибках статуса
});
// Проверяем, что мы на странице входа
cy.url().should('include', '/signin');
// Вводим данные для входа
cy.get('#email', { timeout: 10000 }).should('be.visible').type('test@test.ru');
cy.get('#password', { timeout: 10000 }).should('be.visible').type('testtest');
cy.get('button[type="submit"]', { timeout: 10000 }).should('be.visible').click();
// Ждем успешного входа
cy.url().should('not.include', '/signin', { timeout: 10000 });
});

13
cypress/support/e2e.ts Normal file

@ -0,0 +1,13 @@
// Import commands.js using ES2015 syntax:
import './commands';
// Alternatively you can use CommonJS syntax:
// require('./commands')
declare global {
namespace Cypress {
interface Chainable {
login(): Chainable<void>
}
}
}

@ -69,7 +69,9 @@
"test": "craco test",
"eject": "craco eject",
"code:format": "prettier --write --ignore-unknown",
"prepare": "husky install"
"prepare": "husky install",
"cypress:open": "cypress open",
"cypress:run": "cypress run"
},
"browserslist": {
"production": [
@ -86,10 +88,12 @@
"devDependencies": {
"@emoji-mart/data": "^1.2.1",
"@emoji-mart/react": "^1.1.1",
"@types/cypress": "^1.1.6",
"@types/cytoscape-popper": "^2.0.4",
"@types/react-beautiful-dnd": "^13.1.4",
"@types/react-cytoscapejs": "^1.2.4",
"craco-alias": "^3.0.1",
"cypress": "^14.4.1",
"husky": "^8.0.3",
"lint-staged": "^15.2.0",
"prettier": "^3.1.1"

@ -53,6 +53,7 @@ export const AuditoryLink = ({ utmParams, item, index, onDelete }: AuditoryLinkP
secondaryAction={
<>
<IconButton
className="delete_aud"
edge="end"
aria-label="delete"
sx={{ color: theme.palette.brightPurple.main, p: 0, width: 18, height: 18 }}
@ -75,7 +76,9 @@ export const AuditoryLink = ({ utmParams, item, index, onDelete }: AuditoryLinkP
</>
}
>
<Typography sx={{
<Typography
className="link"
sx={{
color: 'black',
fontWeight: 400,
fontSize: "16px",

@ -22,7 +22,7 @@ import { quizApi } from "@api/quiz";
import { setQuizes } from "@root/quizes/actions";
import TooltipClickInfo from "@/ui_kit/Toolbars/TooltipClickInfo";
const tariff = "6844b8858258f5cc35791ef7";
const tariff = isTestServer ? "6844b8858258f5cc35791ef7" : "6851db40acfb4d3e5fcd9b19";
export default function PersonalizationAI() {
const theme = useTheme();
const [auditory, setAuditory] = useState<AuditoryItem[]>([]);
@ -376,7 +376,7 @@ export default function PersonalizationAI() {
}}
>
<Typography sx={{ width: "100%", textAlign: "center", mb: "25px" }}>Уверены, что хотите удалить ссылку?</Typography>
<Button sx={{ mb: "20px" }} onClick={handleDelete}>Удалить</Button>
<Button sx={{ mb: "20px" }} id="delete_OK" onClick={handleDelete}>Удалить</Button>
<Button variant="contained" onClick={() => setDeleteModal(0)} >Отмена</Button>
</Box>
</Modal>

722
yarn.lock

File diff suppressed because it is too large Load Diff