From 50a32d557cd2108f56ec61f256a28248b00968a9 Mon Sep 17 00:00:00 2001 From: Mateusz Kwasniewski Date: Thu, 21 Dec 2023 14:14:16 +0100 Subject: [PATCH] fix: last seen cherrypick (#5717) --- .../feature-toggle-strategies-store.ts | 27 +++++++++++-------- .../tests/feature-toggle-service.e2e.test.ts | 4 ++- .../api/admin/project/projects.e2e.test.ts | 13 +++++++-- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/lib/features/feature-toggle/feature-toggle-strategies-store.ts b/src/lib/features/feature-toggle/feature-toggle-strategies-store.ts index d41a57a8bb0c..8ccfc1be49af 100644 --- a/src/lib/features/feature-toggle/feature-toggle-strategies-store.ts +++ b/src/lib/features/feature-toggle/feature-toggle-strategies-store.ts @@ -25,6 +25,7 @@ import { ensureStringValue, mapValues } from '../../util'; import { IFeatureProjectUserParams } from './feature-toggle-controller'; import { Db } from '../../db/db'; import Raw = Knex.Raw; +import { isAfter } from 'date-fns'; import { IFeatureSearchParams, IQueryParam, @@ -387,7 +388,6 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore { acc.description = r.description; acc.project = r.project; acc.stale = r.stale; - acc.lastSeenAt = r.last_seen_at; acc.createdAt = r.created_at; acc.type = r.type; @@ -399,8 +399,11 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore { } if ( - acc.lastSeenAt === undefined || - new Date(r.env_last_seen_at) > new Date(acc.lastSeenAt) + acc.lastSeenAt == null || + isAfter( + new Date(r.env_last_seen_at), + new Date(acc.lastSeenAt), + ) ) { acc.lastSeenAt = r.env_last_seen_at; } @@ -861,7 +864,7 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore { getAggregatedSearchData(rows): IFeatureOverview { return rows.reduce((acc, row) => { - if (acc[row.feature_name] !== undefined) { + if (acc[row.feature_name]) { const environmentExists = acc[ row.feature_name ].environments.some( @@ -906,9 +909,10 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore { } const featureRow = acc[row.feature_name]; if ( - featureRow.lastSeenAt === undefined || - new Date(row.env_last_seen_at) > - new Date(featureRow.last_seen_at) + isAfter( + new Date(row.env_last_seen_at), + new Date(featureRow.lastSeenAt), + ) ) { featureRow.lastSeenAt = row.env_last_seen_at; } @@ -918,7 +922,7 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore { getFeatureOverviewData(rows): IFeatureOverview { return rows.reduce((acc, row) => { - if (acc[row.feature_name] !== undefined) { + if (acc[row.feature_name]) { const environmentExists = acc[ row.feature_name ].environments.some( @@ -953,9 +957,10 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore { } const featureRow = acc[row.feature_name]; if ( - featureRow.lastSeenAt === undefined || - new Date(row.env_last_seen_at) > - new Date(featureRow.last_seen_at) + isAfter( + new Date(row.env_last_seen_at), + new Date(featureRow.lastSeenAt), + ) ) { featureRow.lastSeenAt = row.env_last_seen_at; } diff --git a/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts b/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts index 7aa7e8e8ec91..5303b774fcab 100644 --- a/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts +++ b/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts @@ -680,13 +680,14 @@ test('Should return last seen at per environment', async () => { db.rawDatabase, ); - const { environments } = await service.getFeature({ + const { environments, lastSeenAt } = await service.getFeature({ featureName, projectId: 'default', environmentVariants: false, }); expect(environments[0].lastSeenAt).toEqual(new Date(date)); + expect(lastSeenAt).toEqual(new Date(date)); // Test with feature flag on const config = createTestConfig(); @@ -707,4 +708,5 @@ test('Should return last seen at per environment', async () => { expect(featureToggle.environments[0].lastSeenAt).toEqual( new Date(lastSeenAtStoreDate), ); + expect(featureToggle.lastSeenAt).toEqual(new Date(lastSeenAtStoreDate)); }); diff --git a/src/test/e2e/api/admin/project/projects.e2e.test.ts b/src/test/e2e/api/admin/project/projects.e2e.test.ts index a5d8cd5e325f..4b0c50da0fb5 100644 --- a/src/test/e2e/api/admin/project/projects.e2e.test.ts +++ b/src/test/e2e/api/admin/project/projects.e2e.test.ts @@ -165,6 +165,7 @@ test('response should include last seen at per environment', async () => { .expect(200); expect(body.features[0].environments[0].lastSeenAt).toEqual(testDate); + expect(body.features[0].lastSeenAt).toEqual(testDate); const appWithLastSeenRefactor = await setupAppWithCustomConfig( db.stores, @@ -180,6 +181,9 @@ test('response should include last seen at per environment', async () => { expect(response.body.features[0].environments[0].lastSeenAt).toEqual( '2023-10-01T12:34:56.000Z', ); + expect(response.body.features[0].lastSeenAt).toEqual( + '2023-10-01T12:34:56.000Z', + ); }); test('response should include last seen at per environment for multiple environments', async () => { @@ -221,16 +225,19 @@ test('response should include last seen at per environment for multiple environm 'multiple-environment-last-seen-at', db.rawDatabase, 'default', + '2023-10-01 12:32:56', ); await insertLastSeenAt( 'multiple-environment-last-seen-at', db.rawDatabase, 'development', + '2023-10-01 12:34:56', ); await insertLastSeenAt( 'multiple-environment-last-seen-at', db.rawDatabase, 'production', + '2023-10-01 12:33:56', ); const { body } = await appWithLastSeenRefactor.request @@ -243,11 +250,13 @@ test('response should include last seen at per environment for multiple environm const [def, development, production] = featureEnvironments; expect(def.name).toBe('default'); - expect(def.lastSeenAt).toEqual('2023-10-01T12:34:56.000Z'); + expect(def.lastSeenAt).toEqual('2023-10-01T12:32:56.000Z'); expect(development.name).toBe('development'); expect(development.lastSeenAt).toEqual('2023-10-01T12:34:56.000Z'); expect(production.name).toBe('production'); - expect(production.lastSeenAt).toEqual('2023-10-01T12:34:56.000Z'); + expect(production.lastSeenAt).toEqual('2023-10-01T12:33:56.000Z'); + + expect(body.features[1].lastSeenAt).toBe('2023-10-01T12:34:56.000Z'); });