mirror of
https://github.com/Unleash/unleash.git
synced 2025-05-17 01:17:29 +02:00
Add type to environments
- Now returns type as part of the environment object when requesting a feature
This commit is contained in:
parent
7c1909a4a9
commit
e7b948e9db
@ -210,6 +210,10 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore {
|
|||||||
'features.last_seen_at as last_seen_at',
|
'features.last_seen_at as last_seen_at',
|
||||||
'feature_environments.enabled as enabled',
|
'feature_environments.enabled as enabled',
|
||||||
'feature_environments.environment as environment',
|
'feature_environments.environment as environment',
|
||||||
|
'environments.name as environment_name',
|
||||||
|
'environments.type as environment_type',
|
||||||
|
'environments.sort_order as environment_sort_order',
|
||||||
|
'environments.display_name as environment_display_name',
|
||||||
'feature_strategies.id as strategy_id',
|
'feature_strategies.id as strategy_id',
|
||||||
'feature_strategies.strategy_name as strategy_name',
|
'feature_strategies.strategy_name as strategy_name',
|
||||||
'feature_strategies.parameters as parameters',
|
'feature_strategies.parameters as parameters',
|
||||||
@ -232,7 +236,13 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore {
|
|||||||
'feature_environments.environment',
|
'feature_environments.environment',
|
||||||
);
|
);
|
||||||
})
|
})
|
||||||
.where({ name: featureName, archived: archived ? 1 : 0 });
|
.fullOuterJoin(
|
||||||
|
'environments',
|
||||||
|
'feature_environments.environment',
|
||||||
|
'environments.name',
|
||||||
|
)
|
||||||
|
.where('features.name', featureName)
|
||||||
|
.andWhere('features.archived', archived ? 1 : 0);
|
||||||
stopTimer();
|
stopTimer();
|
||||||
if (rows.length > 0) {
|
if (rows.length > 0) {
|
||||||
const featureToggle = rows.reduce((acc, r) => {
|
const featureToggle = rows.reduce((acc, r) => {
|
||||||
@ -254,6 +264,8 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore {
|
|||||||
}
|
}
|
||||||
const env = acc.environments[r.environment];
|
const env = acc.environments[r.environment];
|
||||||
env.enabled = r.enabled;
|
env.enabled = r.enabled;
|
||||||
|
env.type = r.environment_type;
|
||||||
|
env.sortOrder = r.environment_sort_order;
|
||||||
if (!env.strategies) {
|
if (!env.strategies) {
|
||||||
env.strategies = [];
|
env.strategies = [];
|
||||||
}
|
}
|
||||||
@ -265,7 +277,10 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore {
|
|||||||
}, {});
|
}, {});
|
||||||
featureToggle.environments = Object.values(
|
featureToggle.environments = Object.values(
|
||||||
featureToggle.environments,
|
featureToggle.environments,
|
||||||
);
|
).sort((a, b) => {
|
||||||
|
// @ts-ignore
|
||||||
|
return a.sortOrder - b.sortOrder;
|
||||||
|
});
|
||||||
featureToggle.environments = featureToggle.environments.map((e) => {
|
featureToggle.environments = featureToggle.environments.map((e) => {
|
||||||
e.strategies = e.strategies.sort(
|
e.strategies = e.strategies.sort(
|
||||||
(a, b) => a.sortOrder - b.sortOrder,
|
(a, b) => a.sortOrder - b.sortOrder,
|
||||||
@ -286,6 +301,8 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore {
|
|||||||
name: r.environment,
|
name: r.environment,
|
||||||
displayName: r.display_name,
|
displayName: r.display_name,
|
||||||
enabled: r.enabled,
|
enabled: r.enabled,
|
||||||
|
type: r.environment_type,
|
||||||
|
sortOrder: r.environment_sort_order,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -304,6 +321,8 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore {
|
|||||||
'feature_environments.enabled as enabled',
|
'feature_environments.enabled as enabled',
|
||||||
'feature_environments.environment as environment',
|
'feature_environments.environment as environment',
|
||||||
'environments.display_name as display_name',
|
'environments.display_name as display_name',
|
||||||
|
'environments.type as environment_type',
|
||||||
|
'environments.sort_order as environment_sort_order',
|
||||||
)
|
)
|
||||||
.fullOuterJoin(
|
.fullOuterJoin(
|
||||||
'feature_environments',
|
'feature_environments',
|
||||||
|
@ -114,12 +114,15 @@ export interface IEnvironmentCreate {
|
|||||||
name: string;
|
name: string;
|
||||||
displayName: string;
|
displayName: string;
|
||||||
type: string;
|
type: string;
|
||||||
|
sortOrder?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IEnvironmentOverview {
|
export interface IEnvironmentOverview {
|
||||||
name: string;
|
name: string;
|
||||||
displayName: string;
|
displayName: string;
|
||||||
enabled: boolean;
|
enabled: boolean;
|
||||||
|
type: string;
|
||||||
|
sortOrder: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IFeatureOverview {
|
export interface IFeatureOverview {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import dbInit, { ITestDb } from '../../../helpers/database-init';
|
import dbInit, { ITestDb } from '../../../helpers/database-init';
|
||||||
import { IUnleashTest, setupApp } from '../../../helpers/test-helper';
|
import { IUnleashTest, setupApp } from '../../../helpers/test-helper';
|
||||||
import getLogger from '../../../../fixtures/no-logger';
|
import getLogger from '../../../../fixtures/no-logger';
|
||||||
|
import { GLOBAL_ENV } from '../../../../../lib/types/environment';
|
||||||
|
|
||||||
let app: IUnleashTest;
|
let app: IUnleashTest;
|
||||||
let db: ITestDb;
|
let db: ITestDb;
|
||||||
@ -579,6 +580,76 @@ test('Can add strategy to feature toggle to default env', async () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Environments are returned in sortOrder', async () => {
|
||||||
|
const sortedSecond = 'sortedSecond';
|
||||||
|
const sortedLast = 'sortedLast';
|
||||||
|
const featureName = 'feature.strategy.toggle.sortOrder';
|
||||||
|
// Create environments
|
||||||
|
await db.stores.environmentStore.create({
|
||||||
|
name: sortedLast,
|
||||||
|
displayName: 'Enable feature for environment',
|
||||||
|
type: 'production',
|
||||||
|
sortOrder: 8000,
|
||||||
|
});
|
||||||
|
await db.stores.environmentStore.create({
|
||||||
|
name: sortedSecond,
|
||||||
|
displayName: 'Enable feature for environment',
|
||||||
|
type: 'production',
|
||||||
|
sortOrder: 8,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Connect environments to project
|
||||||
|
await app.request
|
||||||
|
.post('/api/admin/projects/default/environments')
|
||||||
|
.send({
|
||||||
|
environment: sortedSecond,
|
||||||
|
})
|
||||||
|
.expect(200);
|
||||||
|
await app.request
|
||||||
|
.post('/api/admin/projects/default/environments')
|
||||||
|
.send({
|
||||||
|
environment: sortedLast,
|
||||||
|
})
|
||||||
|
.expect(200);
|
||||||
|
/* Create feature toggle */
|
||||||
|
await app.request
|
||||||
|
.post('/api/admin/projects/default/features')
|
||||||
|
.send({ name: featureName })
|
||||||
|
.expect(201);
|
||||||
|
/* create strategies connected to feature toggle */
|
||||||
|
await app.request
|
||||||
|
.post(
|
||||||
|
`/api/admin/projects/default/features/${featureName}/environments/${sortedSecond}/strategies`,
|
||||||
|
)
|
||||||
|
.send({
|
||||||
|
name: 'default',
|
||||||
|
parameters: {
|
||||||
|
userId: 'string',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.expect(200);
|
||||||
|
await app.request
|
||||||
|
.post(
|
||||||
|
`/api/admin/projects/default/features/${featureName}/environments/${sortedLast}/strategies`,
|
||||||
|
)
|
||||||
|
.send({
|
||||||
|
name: 'default',
|
||||||
|
parameters: {
|
||||||
|
userId: 'string',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.expect(200);
|
||||||
|
await app.request
|
||||||
|
.get(`/api/admin/projects/default/features/${featureName}`)
|
||||||
|
.expect(200)
|
||||||
|
.expect((res) => {
|
||||||
|
expect(res.body.environments).toHaveLength(3);
|
||||||
|
expect(res.body.environments[0].name).toBe(GLOBAL_ENV);
|
||||||
|
expect(res.body.environments[1].name).toBe(sortedSecond);
|
||||||
|
expect(res.body.environments[2].name).toBe(sortedLast);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
test('Can get strategies for feature and environment', async () => {
|
test('Can get strategies for feature and environment', async () => {
|
||||||
const envName = 'get-strategy';
|
const envName = 'get-strategy';
|
||||||
// Create environment
|
// Create environment
|
||||||
@ -829,7 +900,7 @@ test('Can not enable environment for feature without strategies', async () => {
|
|||||||
.set('Content-Type', 'application/json')
|
.set('Content-Type', 'application/json')
|
||||||
.expect(403);
|
.expect(403);
|
||||||
await app.request
|
await app.request
|
||||||
.get('/api/admin/projects/default/features/com.test.enable.environment')
|
.get(`/api/admin/projects/default/features/${featureName}`)
|
||||||
.expect(200)
|
.expect(200)
|
||||||
.expect('Content-Type', /json/)
|
.expect('Content-Type', /json/)
|
||||||
.expect((res) => {
|
.expect((res) => {
|
||||||
@ -837,6 +908,7 @@ test('Can not enable environment for feature without strategies', async () => {
|
|||||||
(e) => e.name === environment,
|
(e) => e.name === environment,
|
||||||
);
|
);
|
||||||
expect(enabledFeatureEnv.enabled).toBe(false);
|
expect(enabledFeatureEnv.enabled).toBe(false);
|
||||||
|
expect(enabledFeatureEnv.type).toBe('test');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user