UNPKG

unleash-server

Version:

Unleash is an enterprise ready feature toggles service. It provides different strategies for handling feature toggles.

302 lines • 9.89 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const database_init_1 = __importDefault(require("../../../helpers/database-init")); const test_helper_1 = require("../../../helpers/test-helper"); const no_logger_1 = __importDefault(require("../../../../fixtures/no-logger")); let app; let db; let user; beforeAll(async () => { db = await (0, database_init_1.default)('project_health_api_serial', no_logger_1.default); app = await (0, test_helper_1.setupApp)(db.stores); user = await db.stores.userStore.insert({ name: 'Some Name', email: 'test@getunleash.io', }); }); afterAll(async () => { await app.destroy(); await db.destroy(); }); test('Project with no stale toggles should have 100% health rating', async () => { const project = { id: 'fresh', name: 'Health rating', description: 'Fancy', }; await app.services.projectService.createProject(project, user); await app.request .post('/api/admin/projects/fresh/features') .send({ name: 'health-rating-not-stale', description: 'new', stale: false, }) .expect(201); await app.request .post('/api/admin/projects/fresh/features') .send({ name: 'health-rating-not-stale-2', description: 'new too', stale: false, }) .expect(201); await app.request .get('/api/admin/projects/fresh') .expect(200) .expect('Content-Type', /json/) .expect((res) => { expect(res.body.health).toBe(100); expect(res.body.environments).toHaveLength(1); expect(res.body.environments).toStrictEqual(['default']); }); }); test('Health rating endpoint yields stale, potentially stale and active count on top of health', async () => { const project = { id: 'test-health', name: 'Health rating', description: 'Fancy', }; await app.services.projectService.createProject(project, user); await app.request .post(`/api/admin/projects/${project.id}/features`) .send({ name: 'health-report-new', description: 'new', stale: false, }) .expect(201); await app.request .post(`/api/admin/projects/${project.id}/features`) .send({ name: 'health-report-new-2', description: 'new too', stale: false, }) .expect(201); await app.request .post(`/api/admin/projects/${project.id}/features`) .send({ name: 'health-report-stale', description: 'new too', stale: true, }) .expect(201); await app.services.projectHealthService.setHealthRating(); await app.request .get(`/api/admin/projects/${project.id}/health-report`) .expect(200) .expect('Content-Type', /json/) .expect((res) => { expect(res.body.health).toBe(67); expect(res.body.activeCount).toBe(2); expect(res.body.staleCount).toBe(1); expect(res.body.potentiallyStaleCount).toBe(0); }); }); test('Health rating endpoint does not include archived toggles when calculating potentially stale toggles', async () => { const project = { id: 'potentially-stale-archived', name: 'Health rating', description: 'Fancy', }; await app.services.projectService.createProject(project, user); await app.request .post(`/api/admin/projects/${project.id}/features`) .send({ name: 'potentially-stale-archive-fresh', description: 'new', stale: false, }) .expect(201); await app.request .post(`/api/admin/projects/${project.id}/features`) .send({ name: 'potentially-stale-archive-fresh-2', description: 'new too', stale: false, }) .expect(201); await app.request .post(`/api/admin/projects/${project.id}/features`) .send({ name: 'potentially-stale-archive-stale', description: 'stale', stale: true, }) .expect(201); await app.request .post(`/api/admin/projects/${project.id}/features`) .send({ name: 'potentially-archive-stale', description: 'Really Old', createdAt: new Date(2019, 5, 1), }) .expect(201); await app.request .post(`/api/admin/projects/${project.id}/features`) .send({ name: 'potentially-archive-stale-archived', description: 'Really Old', createdAt: new Date(2019, 5, 1), archived: true, }) .expect(201); await app.services.projectHealthService.setHealthRating(); await app.request .get(`/api/admin/projects/${project.id}/health-report`) .expect(200) .expect('Content-Type', /json/) .expect((res) => { expect(res.body.health).toBe(50); expect(res.body.activeCount).toBe(3); expect(res.body.staleCount).toBe(1); expect(res.body.potentiallyStaleCount).toBe(1); }); }); test('Health rating endpoint correctly handles potentially stale toggles', async () => { const project = { id: 'potentially-stale', name: 'Health rating', description: 'Fancy', }; await app.services.projectService.createProject(project, user); await app.request .post(`/api/admin/projects/${project.id}/features`) .send({ name: 'potentially-stale-fresh', description: 'new', stale: false, }) .expect(201); await app.request .post(`/api/admin/projects/${project.id}/features`) .send({ name: 'potentially-stale-fresh-2', description: 'new too', stale: false, }) .expect(201); await app.request .post(`/api/admin/projects/${project.id}/features`) .send({ name: 'potentially-stale-stale', description: 'stale', stale: true, }) .expect(201); await app.request .post(`/api/admin/projects/${project.id}/features`) .send({ name: 'potentially-stale', description: 'Really Old', createdAt: new Date(2019, 5, 1), }) .expect(201); await app.services.projectHealthService.setHealthRating(); await app.request .get(`/api/admin/projects/${project.id}/health-report`) .expect(200) .expect('Content-Type', /json/) .expect((res) => { expect(res.body.health).toBe(50); expect(res.body.activeCount).toBe(3); expect(res.body.staleCount).toBe(1); expect(res.body.potentiallyStaleCount).toBe(1); }); }); test('Health report for non-existing project yields 404', async () => { await app.request .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, type: 'production', sortOrder: 0, }); await db.stores.environmentStore.create({ name: envTwo, 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'; await db.stores.environmentStore.create({ name: envOne, type: 'production', sortOrder: -5, }); await db.stores.environmentStore.create({ name: envTwo, 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]; expect(feature.environments[0].name).toBe(envOne); expect(feature.environments[1].name).toBe(envTwo); }); }); test('Update update_at when setHealth runs', async () => { await app.services.projectHealthService.setHealthRating(); await app.request .get('/api/admin/projects/default/health-report') .expect(200) .expect('Content-Type', /json/) .expect((res) => { let now = new Date().getTime(); let updatedAt = new Date(res.body.updatedAt).getTime(); expect(now - updatedAt).toBeLessThan(5000); }); }); //# sourceMappingURL=project.health.e2e.test.js.map