mirror of
https://github.com/Unleash/unleash.git
synced 2024-12-22 19:07:54 +01:00
c0369b739e
This PR fixes a race condition between e2e tests where bulk archiving all toggles in the default project would delete toggles used for the features e2e tests. It does by isolating the features.spec and overview.spec to their respective projects, so that they always operate on isolated data. ### Future enhancements: I'm not particularly fond of passing the projectName through to all the helper methods. It complicates the tests more than it should. I would like to be able to set the project once per test and have all the helper methods be aware of the context. Something like this should work: ``` before(() => { cy.wrap('projectId').as('project'); }) ``` And in the helpers: ``` export const createFeature_API = ( featureName: string, options?: Partial<Cypress.RequestOptions>, ): Chainable<any> => { return cy.get('@project').then((project) => { projectName = project || 'default'; return cy.request({ url: `${baseUrl}/api/admin/projects/${projectName}/features`, method: 'POST', body: { name: `${featureName}`, description: 'hello-world', type: 'release', impressionData: false, }, ...options, }); }); }; ```
132 lines
3.5 KiB
TypeScript
132 lines
3.5 KiB
TypeScript
///<reference path="../global.d.ts" />
|
|
|
|
import Chainable = Cypress.Chainable;
|
|
const baseUrl = Cypress.config().baseUrl;
|
|
const password = `${Cypress.env(`AUTH_PASSWORD`)}_A`;
|
|
const PROJECT_MEMBER = 5;
|
|
|
|
export const createFeature_API = (
|
|
featureName: string,
|
|
projectName?: string,
|
|
options?: Partial<Cypress.RequestOptions>,
|
|
): Chainable<any> => {
|
|
const project = projectName || 'default';
|
|
return cy.request({
|
|
url: `${baseUrl}/api/admin/projects/${project}/features`,
|
|
method: 'POST',
|
|
body: {
|
|
name: `${featureName}`,
|
|
description: 'hello-world',
|
|
type: 'release',
|
|
impressionData: false,
|
|
},
|
|
...options,
|
|
});
|
|
};
|
|
|
|
export const deleteFeature_API = (
|
|
name: string,
|
|
projectName?: string,
|
|
): Chainable<any> => {
|
|
const project = projectName || 'default';
|
|
cy.request({
|
|
method: 'DELETE',
|
|
url: `${baseUrl}/api/admin/projects/${projectName}/features/${name}`,
|
|
});
|
|
return cy.request({
|
|
method: 'DELETE',
|
|
url: `${baseUrl}/api/admin/archive/${name}`,
|
|
});
|
|
};
|
|
|
|
export const createProject_API = (
|
|
project: string,
|
|
options?: Partial<Cypress.RequestOptions>,
|
|
): Chainable<any> => {
|
|
return cy.request({
|
|
url: `${baseUrl}/api/admin/projects`,
|
|
method: 'POST',
|
|
body: {
|
|
id: project,
|
|
name: project,
|
|
description: project,
|
|
impressionData: false,
|
|
},
|
|
...options,
|
|
});
|
|
};
|
|
|
|
export const deleteProject_API = (name: string): Chainable<any> => {
|
|
return cy.request({
|
|
method: 'DELETE',
|
|
url: `${baseUrl}/api/admin/projects/${name}`,
|
|
});
|
|
};
|
|
|
|
export const createUser_API = (userName: string, role: number) => {
|
|
const name = `${userName}`;
|
|
const email = `${name}@test.com`;
|
|
const userIds: number[] = [];
|
|
const userCredentials: Cypress.UserCredentials[] = [];
|
|
cy.request('POST', `${baseUrl}/api/admin/user-admin`, {
|
|
name: name,
|
|
email: `${name}@test.com`,
|
|
username: `${name}@test.com`,
|
|
sendEmail: false,
|
|
rootRole: role,
|
|
})
|
|
.as(name)
|
|
.then((response) => {
|
|
const id = response.body.id;
|
|
updateUserPassword_API(id).then(() => {
|
|
addUserToProject_API(id, PROJECT_MEMBER).then((value) => {
|
|
userIds.push(id);
|
|
userCredentials.push({ email, password });
|
|
});
|
|
});
|
|
});
|
|
return cy.wrap({ userIds, userCredentials });
|
|
};
|
|
|
|
export const updateUserPassword_API = (id: number, pass?: string): Chainable =>
|
|
cy.request(
|
|
'POST',
|
|
`${baseUrl}/api/admin/user-admin/${id}/change-password`,
|
|
{
|
|
password: pass || password,
|
|
},
|
|
);
|
|
|
|
export const addUserToProject_API = (
|
|
id: number,
|
|
role: number,
|
|
projectName?: string,
|
|
): Chainable => {
|
|
const project = projectName || 'default';
|
|
return cy.request(
|
|
'POST',
|
|
`${baseUrl}/api/admin/projects/${project}/role/${role}/access`,
|
|
{
|
|
groups: [],
|
|
users: [{ id }],
|
|
},
|
|
);
|
|
};
|
|
|
|
interface IEnvironment {
|
|
name: string;
|
|
type: 'development' | 'preproduction' | 'test' | 'production';
|
|
}
|
|
|
|
export const createEnvironment_API = (
|
|
environment: IEnvironment,
|
|
options?: Partial<Cypress.RequestOptions>,
|
|
): Chainable<any> => {
|
|
return cy.request({
|
|
url: `${baseUrl}/api/admin/environments`,
|
|
method: 'POST',
|
|
body: environment,
|
|
...options,
|
|
});
|
|
};
|