2023-04-04 10:46:28 +02:00
|
|
|
///<reference path="../../global.d.ts" />
|
2021-09-30 11:44:30 +02:00
|
|
|
|
2023-04-05 13:20:58 +02:00
|
|
|
describe('feature', () => {
|
|
|
|
const randomId = String(Math.random()).split('.')[1];
|
|
|
|
const featureToggleName = `unleash-e2e-${randomId}`;
|
refactor: isolate tests (#5433)
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,
});
});
};
```
2023-11-27 13:55:44 +01:00
|
|
|
const projectName = `unleash-e2e-project-${randomId}`;
|
2023-04-04 10:46:28 +02:00
|
|
|
|
2023-04-05 13:20:58 +02:00
|
|
|
const variant1 = 'variant1';
|
|
|
|
const variant2 = 'variant2';
|
2021-09-30 11:44:30 +02:00
|
|
|
|
2022-03-23 12:45:23 +01:00
|
|
|
before(() => {
|
2023-04-04 10:46:28 +02:00
|
|
|
cy.runBefore();
|
refactor: isolate tests (#5433)
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,
});
});
};
```
2023-11-27 13:55:44 +01:00
|
|
|
cy.login_UI();
|
|
|
|
cy.createProject_API(projectName);
|
2022-03-23 12:45:23 +01:00
|
|
|
});
|
|
|
|
|
2021-09-30 11:44:30 +02:00
|
|
|
after(() => {
|
refactor: isolate tests (#5433)
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,
});
});
};
```
2023-11-27 13:55:44 +01:00
|
|
|
cy.deleteFeature_API(featureToggleName, projectName);
|
|
|
|
cy.deleteProject_API(projectName);
|
2021-09-30 11:44:30 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
beforeEach(() => {
|
2023-04-04 10:46:28 +02:00
|
|
|
cy.login_UI();
|
2022-11-28 11:12:45 +01:00
|
|
|
cy.visit('/features');
|
2021-09-30 11:44:30 +02:00
|
|
|
});
|
|
|
|
|
2022-02-25 10:21:28 +01:00
|
|
|
it('can create a feature toggle', () => {
|
refactor: isolate tests (#5433)
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,
});
});
};
```
2023-11-27 13:55:44 +01:00
|
|
|
cy.createFeature_UI(featureToggleName, true, projectName);
|
2021-09-30 11:44:30 +02:00
|
|
|
cy.url().should('include', featureToggleName);
|
|
|
|
});
|
|
|
|
|
2022-02-25 10:21:28 +01:00
|
|
|
it('gives an error if a toggle exists with the same name', () => {
|
refactor: isolate tests (#5433)
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,
});
});
};
```
2023-11-27 13:55:44 +01:00
|
|
|
cy.createFeature_UI(featureToggleName, false, projectName);
|
2022-04-08 13:13:45 +02:00
|
|
|
cy.get("[data-testid='INPUT_ERROR_TEXT']").contains(
|
2023-10-02 14:25:46 +02:00
|
|
|
'A toggle with that name already exists',
|
2022-02-11 00:43:23 +01:00
|
|
|
);
|
|
|
|
});
|
|
|
|
|
2022-02-25 10:21:28 +01:00
|
|
|
it('gives an error if a toggle name is url unsafe', () => {
|
refactor: isolate tests (#5433)
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,
});
});
};
```
2023-11-27 13:55:44 +01:00
|
|
|
cy.createFeature_UI('featureToggleUnsafe####$#//', false, projectName);
|
2022-04-08 13:13:45 +02:00
|
|
|
cy.get("[data-testid='INPUT_ERROR_TEXT']").contains(
|
2023-10-02 14:25:46 +02:00
|
|
|
`"name" must be URL friendly`,
|
2022-02-11 00:43:23 +01:00
|
|
|
);
|
|
|
|
});
|
|
|
|
|
2023-05-08 10:16:18 +02:00
|
|
|
it('can add, update and delete a gradual rollout strategy to the development environment', () => {
|
2023-04-04 10:46:28 +02:00
|
|
|
cy.addFlexibleRolloutStrategyToFeature_UI({
|
|
|
|
featureToggleName,
|
refactor: isolate tests (#5433)
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,
});
});
};
```
2023-11-27 13:55:44 +01:00
|
|
|
project: projectName,
|
2023-05-08 10:16:18 +02:00
|
|
|
}).then(() => {
|
refactor: isolate tests (#5433)
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,
});
});
};
```
2023-11-27 13:55:44 +01:00
|
|
|
cy.updateFlexibleRolloutStrategy_UI(
|
|
|
|
featureToggleName,
|
|
|
|
projectName,
|
|
|
|
).then(() =>
|
|
|
|
cy.deleteFeatureStrategy_UI(
|
|
|
|
featureToggleName,
|
|
|
|
false,
|
|
|
|
projectName,
|
|
|
|
),
|
2023-04-04 10:46:28 +02:00
|
|
|
);
|
|
|
|
});
|
2021-09-30 11:44:30 +02:00
|
|
|
});
|
|
|
|
|
2023-04-04 10:46:28 +02:00
|
|
|
it('can add variants to the development environment', () => {
|
refactor: isolate tests (#5433)
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,
});
});
};
```
2023-11-27 13:55:44 +01:00
|
|
|
cy.addVariantsToFeature_UI(
|
|
|
|
featureToggleName,
|
|
|
|
[variant1, variant2],
|
|
|
|
projectName,
|
|
|
|
);
|
2021-10-08 11:23:29 +02:00
|
|
|
});
|
2021-10-28 13:32:29 +02:00
|
|
|
|
2023-04-04 10:46:28 +02:00
|
|
|
it('can update variants', () => {
|
refactor: isolate tests (#5433)
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,
});
});
};
```
2023-11-27 13:55:44 +01:00
|
|
|
cy.visit(
|
|
|
|
`/projects/${projectName}/features/${featureToggleName}/variants`,
|
|
|
|
);
|
2022-02-25 10:21:28 +01:00
|
|
|
|
2023-02-14 15:02:02 +01:00
|
|
|
cy.get('[data-testid=EDIT_VARIANTS_BUTTON]').click();
|
2022-04-08 13:13:45 +02:00
|
|
|
cy.get('[data-testid=VARIANT_NAME_INPUT]')
|
2023-02-14 15:02:02 +01:00
|
|
|
.last()
|
2021-10-08 11:23:29 +02:00
|
|
|
.children()
|
|
|
|
.find('input')
|
|
|
|
.should('have.attr', 'disabled');
|
2023-02-14 15:02:02 +01:00
|
|
|
cy.get('[data-testid=VARIANT_WEIGHT_CHECK]')
|
|
|
|
.last()
|
|
|
|
.find('input')
|
|
|
|
.check();
|
|
|
|
cy.get('[data-testid=VARIANT_WEIGHT_INPUT]').last().clear().type('15');
|
2022-02-25 10:21:28 +01:00
|
|
|
|
2021-10-08 11:23:29 +02:00
|
|
|
cy.intercept(
|
|
|
|
'PATCH',
|
refactor: isolate tests (#5433)
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,
});
});
};
```
2023-11-27 13:55:44 +01:00
|
|
|
`/api/admin/projects/${projectName}/features/${featureToggleName}/environments/development/variants`,
|
2023-10-02 14:25:46 +02:00
|
|
|
(req) => {
|
2021-10-08 11:23:29 +02:00
|
|
|
expect(req.body[0].op).to.equal('replace');
|
2023-02-14 15:02:02 +01:00
|
|
|
expect(req.body[0].path).to.equal('/1/weightType');
|
|
|
|
expect(req.body[0].value).to.equal('fix');
|
2021-10-08 11:23:29 +02:00
|
|
|
expect(req.body[1].op).to.equal('replace');
|
2023-02-14 15:02:02 +01:00
|
|
|
expect(req.body[1].path).to.equal('/1/weight');
|
|
|
|
expect(req.body[1].value).to.equal(150);
|
2021-10-08 11:23:29 +02:00
|
|
|
expect(req.body[2].op).to.equal('replace');
|
2023-02-14 15:02:02 +01:00
|
|
|
expect(req.body[2].path).to.equal('/0/weight');
|
|
|
|
expect(req.body[2].value).to.equal(850);
|
2023-10-02 14:25:46 +02:00
|
|
|
},
|
2022-02-25 10:21:28 +01:00
|
|
|
).as('variantUpdate');
|
|
|
|
|
2022-04-08 13:13:45 +02:00
|
|
|
cy.get('[data-testid=DIALOGUE_CONFIRM_ID]').click();
|
2023-02-14 15:02:02 +01:00
|
|
|
cy.get(`[data-testid=VARIANT_WEIGHT_${variant2}]`).should(
|
2022-05-31 13:45:04 +02:00
|
|
|
'have.text',
|
2023-10-02 14:25:46 +02:00
|
|
|
'15 %',
|
2022-05-31 13:45:04 +02:00
|
|
|
);
|
2021-10-08 11:23:29 +02:00
|
|
|
});
|
|
|
|
|
2023-04-04 10:46:28 +02:00
|
|
|
it('can delete variants', () => {
|
refactor: isolate tests (#5433)
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,
});
});
};
```
2023-11-27 13:55:44 +01:00
|
|
|
cy.deleteVariant_UI(featureToggleName, variant2, projectName);
|
2021-10-08 11:23:29 +02:00
|
|
|
});
|
2021-09-30 11:44:30 +02:00
|
|
|
});
|