diff --git a/src/lib/db/feature-strategy-store.ts b/src/lib/db/feature-strategy-store.ts index d64f7c3f11..a2a8f49c3f 100644 --- a/src/lib/db/feature-strategy-store.ts +++ b/src/lib/db/feature-strategy-store.ts @@ -355,7 +355,14 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore { }, {}); return Object.values(overview).map((o: IFeatureOverview) => ({ ...o, - environments: o.environments.filter((f) => f.name), + environments: o.environments + .filter((f) => f.name) + .sort((a, b) => { + if (a.sortOrder === b.sortOrder) { + return a.name.localeCompare(b.name); + } + return a.sortOrder - b.sortOrder; + }), })); } return []; diff --git a/src/test/e2e/api/admin/project/project.health.e2e.test.ts b/src/test/e2e/api/admin/project/project.health.e2e.test.ts index 7c3d3eea22..bc8d3283e6 100644 --- a/src/test/e2e/api/admin/project/project.health.e2e.test.ts +++ b/src/test/e2e/api/admin/project/project.health.e2e.test.ts @@ -153,3 +153,96 @@ test('Health report for non-existing project yields 404', async () => { .get('/api/admin/projects/some-crazy-project-name/health-report') .expect(404); }); + +test('Sorts environments by sort order', async () => { + const envOne = 'my-sorted-env1'; + const envTwo = 'my-sorted-env2'; + const featureName = 'My-new-toggle'; + const defaultEnvName = 'default'; + await db.stores.environmentStore.create({ + name: envOne, + displayName: 'Enable feature for environment', + type: 'production', + sortOrder: 0, + }); + + await db.stores.environmentStore.create({ + name: envTwo, + displayName: 'Enable feature for environment', + type: 'production', + sortOrder: 500, + }); + + await app.request + .post('/api/admin/projects/default/environments') + .send({ + environment: envOne, + }) + .expect(200); + + await app.request + .post('/api/admin/projects/default/environments') + .send({ + environment: envTwo, + }) + .expect(200); + + await app.request + .post('/api/admin/projects/default/features') + .send({ name: featureName }) + .expect(201); + + await app.request.get('/api/admin/projects/default').expect((res) => { + const feature = res.body.features[0]; + expect(feature.environments[0].name).toBe(envOne); + expect(feature.environments[1].name).toBe(defaultEnvName); + expect(feature.environments[2].name).toBe(envTwo); + }); +}); + +test('Sorts environments correctly if sort order is equal', async () => { + const envOne = 'my-sorted-env3'; + const envTwo = 'my-sorted-env4'; + const featureName = 'My-new-toggle-2'; + const defaultEnvName = 'default'; + + await db.stores.environmentStore.create({ + name: envOne, + displayName: 'Enable feature for environment', + type: 'production', + sortOrder: -5, + }); + + await db.stores.environmentStore.create({ + name: envTwo, + displayName: 'Enable feature for environment', + type: 'production', + sortOrder: -5, + }); + + await app.request + .post('/api/admin/projects/default/environments') + .send({ + environment: envOne, + }) + .expect(200); + + await app.request + .post('/api/admin/projects/default/environments') + .send({ + environment: envTwo, + }) + .expect(200); + + await app.request + .post('/api/admin/projects/default/features') + .send({ name: featureName }) + .expect(201); + + await app.request.get('/api/admin/projects/default').expect((res) => { + const feature = res.body.features[0]; + console.log(feature.environments); + expect(feature.environments[0].name).toBe(envOne); + expect(feature.environments[1].name).toBe(envTwo); + }); +});