|
1 |
| -import { test, expect } from '@playwright/test'; |
| 1 | +import { test } from '@playwright/test'; |
2 | 2 | import { v4 as uuidv4 } from 'uuid';
|
3 | 3 |
|
4 | 4 | import type { Project } from 'common/api/osrdEditoastApi';
|
5 | 5 |
|
6 | 6 | import projectData from './assets/operationStudies/project.json';
|
7 |
| -import CommonPage from './pages/common-page-model'; |
8 | 7 | import HomePage from './pages/home-page-model';
|
9 | 8 | import ProjectPage from './pages/project-page-model';
|
10 |
| -import { deleteApiRequest, getApiRequest, postApiRequest } from './utils/api-setup'; |
| 9 | +import { generateUniqueName } from './utils'; |
| 10 | +import { createProject } from './utils/setup-utils'; |
| 11 | +import { deleteProject } from './utils/teardown-utils'; |
11 | 12 |
|
12 |
| -let project: Project; |
| 13 | +test.describe('Validate the Operational Study Project workflow', () => { |
| 14 | + let project: Project; |
13 | 15 |
|
14 |
| -test.beforeEach(async () => { |
15 |
| - project = await postApiRequest('/api/projects/', { |
16 |
| - ...projectData, |
17 |
| - name: `${projectData.name} ${uuidv4()}`, |
18 |
| - budget: 1234567890, |
| 16 | + test.beforeEach('Navigate to the Operational Studies projects page', async ({ page }) => { |
| 17 | + await page.goto('/operational-studies/projects'); |
19 | 18 | });
|
20 |
| -}); |
21 |
| - |
22 |
| -test.afterEach(async () => { |
23 |
| - await deleteApiRequest(`/api/projects/${project.id}/`); |
24 |
| -}); |
25 | 19 |
|
26 |
| -test.describe('Test if project workflow is working properly', () => { |
| 20 | + /** *************** Test 1 **************** */ |
27 | 21 | test('Create a new project', async ({ page }) => {
|
28 |
| - const homePage = new HomePage(page); |
29 | 22 | const projectPage = new ProjectPage(page);
|
30 |
| - const commonPage = new CommonPage(page); |
31 |
| - |
32 |
| - await homePage.goToHomePage(); |
33 |
| - await homePage.goToOperationalStudiesPage(); |
34 |
| - await expect(projectPage.getAddProjectBtn).toBeVisible(); |
35 |
| - await projectPage.openProjectModalCreation(); |
36 | 23 |
|
| 24 | + // Define a unique project name for the test |
37 | 25 | const projectName = `${projectData.name} ${uuidv4()}`;
|
38 |
| - await projectPage.setProjectName(projectName); |
39 |
| - |
40 |
| - await projectPage.setProjectDescription(projectData.description); |
41 |
| - |
42 |
| - await projectPage.setProjectObjectives(projectData.objectives); |
43 |
| - |
44 |
| - await projectPage.setProjectFunder(projectData.funders); |
45 |
| - |
46 |
| - await projectPage.setProjectBudget(projectData.budget); |
47 |
| - |
48 |
| - await commonPage.setTag(projectData.tags[0]); |
49 |
| - await commonPage.setTag(projectData.tags[1]); |
50 |
| - await commonPage.setTag(projectData.tags[2]); |
51 |
| - |
52 |
| - const createButton = homePage.page.getByTestId('createProject'); |
53 |
| - await createButton.click(); |
54 |
| - await homePage.page.waitForURL('**/projects/*'); |
55 |
| - expect(await projectPage.getProjectName.textContent()).toContain(projectName); |
56 |
| - expect(await projectPage.getProjectDescription.textContent()).toContain( |
57 |
| - projectData.description |
58 |
| - ); |
59 |
| - const objectives = await projectPage.getProjectObjectives.textContent(); |
60 |
| - expect(objectives).not.toEqual(null); |
61 |
| - if (objectives !== null) |
62 |
| - expect(objectives.replace(/[^A-Za-z0-9]/g, '')).toContain( |
63 |
| - (project.objectives ?? '').replace(/[^A-Za-z0-9]/g, '') |
64 |
| - ); |
65 |
| - expect(await projectPage.getProjectFinancialsInfos.textContent()).toContain( |
66 |
| - projectData.funders |
67 |
| - ); |
68 |
| - const budget = await projectPage.getProjectFinancialsAmount.textContent(); |
69 |
| - expect(budget).not.toEqual(null); |
70 |
| - if (budget !== null) expect(budget.replace(/[^0-9]/g, '')).toContain(projectData.budget); |
71 |
| - const tags = await projectPage.getProjectTags.textContent(); |
72 |
| - expect(tags).toContain(projectData.tags.join('')); |
73 |
| - |
74 |
| - const projects = await getApiRequest('/api/projects/'); |
75 |
| - const actualTestProject = projects.results.find((p: Project) => p.name === projectName); |
76 |
| - |
77 |
| - const deleteProject = await deleteApiRequest(`/api/projects/${actualTestProject.id}/`); |
78 |
| - expect(deleteProject.status()).toEqual(204); |
| 26 | + |
| 27 | + // Create a new project using the project page model and json data |
| 28 | + await projectPage.createOrUpdateProject({ |
| 29 | + name: projectName, |
| 30 | + description: projectData.description, |
| 31 | + objectives: projectData.objectives, |
| 32 | + funders: projectData.funders, |
| 33 | + budget: projectData.budget, |
| 34 | + tags: projectData.tags, |
| 35 | + }); |
| 36 | + |
| 37 | + // Validate that the project was created with the correct data |
| 38 | + await projectPage.validateProjectData({ |
| 39 | + name: projectName, |
| 40 | + description: projectData.description, |
| 41 | + objectives: projectData.objectives, |
| 42 | + funders: projectData.funders, |
| 43 | + budget: projectData.budget, |
| 44 | + tags: projectData.tags, |
| 45 | + }); |
| 46 | + |
| 47 | + // Delete the created project |
| 48 | + await deleteProject(projectName); |
79 | 49 | });
|
80 | 50 |
|
81 |
| - test(' update a project', async ({ page }) => { |
| 51 | + /** *************** Test 2 **************** */ |
| 52 | + test('Update an existing project', async ({ page }) => { |
| 53 | + // Create a project |
| 54 | + project = await createProject(generateUniqueName('project_test_e2e')); |
| 55 | + |
82 | 56 | const homePage = new HomePage(page);
|
83 | 57 | const projectPage = new ProjectPage(page);
|
84 |
| - const commonPage = new CommonPage(page); |
85 |
| - |
86 |
| - await page.goto('/operational-studies/projects'); |
87 |
| - |
| 58 | + // Open the created project by name using the project page model |
88 | 59 | await projectPage.openProjectByTestId(project.name);
|
89 | 60 |
|
90 |
| - await projectPage.openProjectModalUpdate(); |
91 |
| - |
92 |
| - await projectPage.setProjectName(`${project.name} (updated)`); |
93 |
| - |
94 |
| - await projectPage.setProjectDescription(`${project.description} (updated)`); |
95 |
| - |
96 |
| - await projectPage.setProjectObjectives(`updated`); |
97 |
| - |
98 |
| - await projectPage.setProjectFunder(`${project.funders} (updated)`); |
99 |
| - |
100 |
| - await projectPage.setProjectBudget('123456789'); |
101 |
| - |
102 |
| - await commonPage.setTag('update-tag'); |
103 |
| - |
104 |
| - await projectPage.clickProjectUpdateConfirmBtn(); |
105 |
| - |
| 61 | + // Update the project data and save it |
| 62 | + await projectPage.createOrUpdateProject({ |
| 63 | + name: `${project.name} (updated)`, |
| 64 | + description: `${project.description} (updated)`, |
| 65 | + objectives: `${projectData.objectives} (updated)`, |
| 66 | + funders: `${project.funders} (updated)`, |
| 67 | + budget: '123456789', |
| 68 | + tags: ['update-tag'], |
| 69 | + isUpdate: true, // Indicate that this is an update |
| 70 | + }); |
| 71 | + |
| 72 | + // Navigate back to the Operational Studies page via the home page |
106 | 73 | await homePage.goToHomePage();
|
107 | 74 | await homePage.goToOperationalStudiesPage();
|
108 | 75 |
|
| 76 | + // Reopen the updated project and validate the updated data |
109 | 77 | await projectPage.openProjectByTestId(`${project.name} (updated)`);
|
110 |
| - |
111 |
| - expect(await projectPage.getProjectName.innerText()).toContain(`${project.name} (updated)`); |
112 |
| - expect(await projectPage.getProjectDescription.textContent()).toContain( |
113 |
| - `${project.description} (updated)` |
114 |
| - ); |
115 |
| - expect(await projectPage.getProjectObjectives.textContent()).toContain('updated'); |
116 |
| - expect(await projectPage.getProjectFinancialsInfos.textContent()).toContain( |
117 |
| - `${project.funders} (updated)` |
118 |
| - ); |
119 |
| - const budget = await projectPage.getProjectFinancialsAmount.textContent(); |
120 |
| - expect(budget).not.toEqual(null); |
121 |
| - if (budget !== null) expect(budget.replace(/[^0-9]/g, '')).toContain('123456789'); |
122 |
| - expect(await projectPage.getProjectTags.textContent()).toContain( |
123 |
| - `${project.tags.join('')}update-tag` |
124 |
| - ); |
125 |
| - |
126 |
| - const deleteProject = await deleteApiRequest(`/api/projects/${project.id}/`); |
127 |
| - expect(deleteProject.status()).toEqual(204); |
| 78 | + await projectPage.validateProjectData({ |
| 79 | + name: `${project.name} (updated)`, |
| 80 | + description: `${project.description} (updated)`, |
| 81 | + objectives: `${projectData.objectives} (updated)`, |
| 82 | + funders: `${project.funders} (updated)`, |
| 83 | + budget: '123456789', |
| 84 | + tags: ['update-tag'], |
| 85 | + }); |
| 86 | + // Delete the created project |
| 87 | + await deleteProject(`${project.name} (updated)`); |
128 | 88 | });
|
129 | 89 |
|
| 90 | + /** *************** Test 3 **************** */ |
130 | 91 | test('Delete a project', async ({ page }) => {
|
131 |
| - const projectPage = new ProjectPage(page); |
132 |
| - |
133 |
| - await page.goto('/operational-studies/projects'); |
| 92 | + // Create a project |
| 93 | + project = await createProject(generateUniqueName('project_test_e2e')); |
134 | 94 |
|
| 95 | + const projectPage = new ProjectPage(page); |
| 96 | + // Find the project by name and delete it using the page model |
135 | 97 | await projectPage.clickProjectByName(project.name);
|
136 |
| - await projectPage.checkLabelProjectSelected(); |
137 |
| - await expect(projectPage.getProjectDeleteBtn).not.toBeEmpty(); |
138 |
| - await projectPage.clickProjectDeleteBtn(); |
139 |
| - await expect(projectPage.getProjectDeleteConfirmBtn).toBeVisible(); |
140 |
| - await projectPage.clickProjectDeleteConfirmBtn(); |
141 |
| - await expect(projectPage.getProjectDeleteConfirmBtn).not.toBeVisible(); |
142 |
| - await expect(projectPage.getProjectDeleteBtn).not.toBeVisible(); |
143 |
| - await expect(projectPage.getProjectByName(project.name)).not.toBeVisible(); |
| 98 | + await projectPage.deleteProject(project.name); |
144 | 99 | });
|
145 | 100 | });
|
0 commit comments