From 77c43b198ef8defc0336d4c215df7646b6729e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominique=20J=C3=A4ggi?= Date: Sat, 2 Dec 2023 09:42:56 +0100 Subject: [PATCH 1/2] fix: distinguish lhs-mobile vs lhs-desktop --- .../src/models/audit.js | 6 ++-- .../test/it/auditUtils.js | 2 +- .../test/it/db.test.js | 35 ++++++++++--------- .../test/it/generateSampleData.js | 6 ++-- .../test/unit/models/audit.test.js | 2 +- .../test/unit/service/audits/index.test.js | 8 ++--- .../test/unit/service/sites/index.test.js | 14 ++++---- 7 files changed, 39 insertions(+), 34 deletions(-) diff --git a/packages/spacecat-shared-data-access/src/models/audit.js b/packages/spacecat-shared-data-access/src/models/audit.js index 7c163bf67..773cc4709 100644 --- a/packages/spacecat-shared-data-access/src/models/audit.js +++ b/packages/spacecat-shared-data-access/src/models/audit.js @@ -14,13 +14,15 @@ import { hasText, isIsoDate, isObject } from '@adobe/spacecat-shared-utils'; import { Base } from './base.js'; export const AUDIT_TYPE_CWV = 'cwv'; -export const AUDIT_TYPE_LHS = 'lhs'; +export const AUDIT_TYPE_LHS_DESKTOP = 'lhs-desktop'; +export const AUDIT_TYPE_LHS_MOBILE = 'lhs-mobile'; const EXPIRES_IN_DAYS = 30; const AUDIT_TYPE_PROPERTIES = { [AUDIT_TYPE_CWV]: [], - [AUDIT_TYPE_LHS]: ['performance', 'seo', 'accessibility', 'best-practices'], + [AUDIT_TYPE_LHS_DESKTOP]: ['performance', 'seo', 'accessibility', 'best-practices'], + [AUDIT_TYPE_LHS_MOBILE]: ['performance', 'seo', 'accessibility', 'best-practices'], }; /** diff --git a/packages/spacecat-shared-data-access/test/it/auditUtils.js b/packages/spacecat-shared-data-access/test/it/auditUtils.js index ff8a75859..7074ed2ef 100644 --- a/packages/spacecat-shared-data-access/test/it/auditUtils.js +++ b/packages/spacecat-shared-data-access/test/it/auditUtils.js @@ -21,7 +21,7 @@ function generateRandomAudit(siteId, auditType) { expiresAt.setDate(expiresAt.getDate() + 30); const fullAuditRef = `s3://audit-results/${uuidv4()}.json`; - if (auditType === 'lhs') { + if (auditType === 'lhs-mobile') { auditResult = { performance: getRandomDecimal(2), seo: getRandomDecimal(2), diff --git a/packages/spacecat-shared-data-access/test/it/db.test.js b/packages/spacecat-shared-data-access/test/it/db.test.js index 790085e5b..9b9a2939b 100644 --- a/packages/spacecat-shared-data-access/test/it/db.test.js +++ b/packages/spacecat-shared-data-access/test/it/db.test.js @@ -19,7 +19,7 @@ import dynamoDbLocal from 'dynamo-db-local'; import { isIsoDate, isValidUrl } from '@adobe/spacecat-shared-utils'; import { sleep } from '../unit/util.js'; import { createDataAccess } from '../../src/service/index.js'; -import { AUDIT_TYPE_LHS } from '../../src/models/audit.js'; +import { AUDIT_TYPE_LHS_MOBILE } from '../../src/models/audit.js'; import generateSampleData from './generateSampleData.js'; @@ -112,7 +112,7 @@ describe('DynamoDB Integration Test', async () => { }); it('gets sites with latest audit', async () => { - const sites = await dataAccess.getSitesWithLatestAudit(AUDIT_TYPE_LHS); + const sites = await dataAccess.getSitesWithLatestAudit(AUDIT_TYPE_LHS_MOBILE); // Every tenth site will not have any audits expect(sites.length).to.equal(NUMBER_OF_SITES - 1); @@ -121,7 +121,7 @@ describe('DynamoDB Integration Test', async () => { checkSite(site); expect(site.getAudits()).to.be.an('array').that.has.lengthOf(1); site.getAudits().forEach((audit) => { - expect(audit.getAuditType()).to.equal(AUDIT_TYPE_LHS); + expect(audit.getAuditType()).to.equal(AUDIT_TYPE_LHS_MOBILE); expect(Object.keys(audit.getScores())).to.have.members( ['performance', 'seo', 'accessibility', 'best-practices'], ); @@ -191,7 +191,7 @@ describe('DynamoDB Integration Test', async () => { it('retrieves audits of a specific type for a site', async () => { const site = await dataAccess.getSiteByBaseURL('https://example1.com'); const siteId = site.getId(); - const auditType = AUDIT_TYPE_LHS; + const auditType = AUDIT_TYPE_LHS_MOBILE; const audits = await dataAccess.getAuditsForSite(siteId, auditType); expect(audits).to.be.an('array').that.has.lengthOf(NUMBER_OF_AUDITS_PER_TYPE_AND_SITE); @@ -206,7 +206,7 @@ describe('DynamoDB Integration Test', async () => { it('retrieves a specific audit for a site', async () => { const site = await dataAccess.getSiteByBaseURL('https://example1.com'); const siteId = site.getId(); - const auditType = AUDIT_TYPE_LHS; + const auditType = AUDIT_TYPE_LHS_MOBILE; const audits = await dataAccess.getAuditsForSite(site.getId(), auditType); const auditedAt = audits[0].getAuditedAt(); @@ -231,27 +231,27 @@ describe('DynamoDB Integration Test', async () => { }); it('retrieves the latest audits of a specific type', async () => { - const audits = await dataAccess.getLatestAudits(AUDIT_TYPE_LHS, true); + const audits = await dataAccess.getLatestAudits(AUDIT_TYPE_LHS_MOBILE, true); // Every tenth site will not have any audits expect(audits).to.be.an('array').that.has.lengthOf(NUMBER_OF_SITES - 1); audits.forEach((audit) => { checkAudit(audit); - expect(audit.getAuditType()).to.equal(AUDIT_TYPE_LHS); + expect(audit.getAuditType()).to.equal(AUDIT_TYPE_LHS_MOBILE); }); // verify the sorting order let lastScoresString = ''; audits.forEach((audit) => { - const currentScoresString = `${AUDIT_TYPE_LHS}#${Object.keys(audit.getScores()).join('#')}`; + const currentScoresString = `${AUDIT_TYPE_LHS_MOBILE}#${Object.keys(audit.getScores()).join('#')}`; expect(currentScoresString.localeCompare(lastScoresString)).to.be.at.least(0); lastScoresString = currentScoresString; }); }); it('retrieves the latest audits in descending order', async () => { - const audits = await dataAccess.getLatestAudits(AUDIT_TYPE_LHS, false); + const audits = await dataAccess.getLatestAudits(AUDIT_TYPE_LHS_MOBILE, false); expect(audits).to.be.an('array').that.has.lengthOf(NUMBER_OF_SITES - 1); @@ -259,7 +259,7 @@ describe('DynamoDB Integration Test', async () => { // assuming 'z' will be lexicographically after any realistic score string let lastScoresString = 'z'; audits.forEach((audit) => { - const currentScoresString = `${AUDIT_TYPE_LHS}#${Object.keys(audit.getScores()).join('#')}`; + const currentScoresString = `${AUDIT_TYPE_LHS_MOBILE}#${Object.keys(audit.getScores()).join('#')}`; expect(currentScoresString.localeCompare(lastScoresString)).to.be.at.most(0); lastScoresString = currentScoresString; }); @@ -269,13 +269,13 @@ describe('DynamoDB Integration Test', async () => { const site = await dataAccess.getSiteByBaseURL('https://example1.com'); const siteId = site.getId(); - const latestAudit = await dataAccess.getLatestAuditForSite(siteId, AUDIT_TYPE_LHS); + const latestAudit = await dataAccess.getLatestAuditForSite(siteId, AUDIT_TYPE_LHS_MOBILE); checkAudit(latestAudit); expect(latestAudit.getSiteId()).to.equal(siteId); - expect(latestAudit.getAuditType()).to.equal(AUDIT_TYPE_LHS); + expect(latestAudit.getAuditType()).to.equal(AUDIT_TYPE_LHS_MOBILE); - const allAudits = await dataAccess.getAuditsForSite(siteId, AUDIT_TYPE_LHS); + const allAudits = await dataAccess.getAuditsForSite(siteId, AUDIT_TYPE_LHS_MOBILE); const mostRecentAudit = allAudits.reduce((latest, current) => ( new Date(latest.getAuditedAt()) > new Date(current.getAuditedAt()) ? latest : current )); @@ -296,7 +296,7 @@ describe('DynamoDB Integration Test', async () => { it('successfully adds a new audit', async () => { const auditData = { siteId: 'https://example1.com', - auditType: AUDIT_TYPE_LHS, + auditType: AUDIT_TYPE_LHS_MOBILE, auditedAt: new Date().toISOString(), isLive: true, fullAuditRef: 's3://ref', @@ -331,7 +331,7 @@ describe('DynamoDB Integration Test', async () => { it('throws an error when adding a duplicate audit', async () => { const auditData = { siteId: 'https://example1.com', - auditType: AUDIT_TYPE_LHS, + auditType: AUDIT_TYPE_LHS_MOBILE, auditedAt: new Date().toISOString(), fullAuditRef: 's3://ref', isLive: true, @@ -361,7 +361,10 @@ describe('DynamoDB Integration Test', async () => { const auditsAfterRemoval = await dataAccess.getAuditsForSite(siteId); expect(auditsAfterRemoval).to.be.an('array').that.is.empty; - const latestAuditAfterRemoval = await dataAccess.getLatestAuditForSite(siteId, AUDIT_TYPE_LHS); + const latestAuditAfterRemoval = await dataAccess.getLatestAuditForSite( + siteId, + AUDIT_TYPE_LHS_MOBILE, + ); expect(latestAuditAfterRemoval).to.be.null; }); }); diff --git a/packages/spacecat-shared-data-access/test/it/generateSampleData.js b/packages/spacecat-shared-data-access/test/it/generateSampleData.js index 1a933224e..bb6479e34 100644 --- a/packages/spacecat-shared-data-access/test/it/generateSampleData.js +++ b/packages/spacecat-shared-data-access/test/it/generateSampleData.js @@ -83,7 +83,7 @@ async function batchWrite(tableName, items) { * * @example * // Example usage - * const audits = generateAuditData('site123', ['lhs', 'cwv'], 5); + * const audits = generateAuditData('site123', ['lhs-mobile', 'cwv'], 5); */ function generateAuditData( config, @@ -110,7 +110,7 @@ function generateAuditData( const latestAuditData = Object.values(latestAudits).map((audit) => { // Modify the audit data for the latest_audits table let GSI1SK = `${audit.auditType}#`; - if (audit.auditType === 'lhs') { + if (audit.auditType === 'lhs-mobile') { GSI1SK += Object.values(audit.auditResult).map((score) => (parseFloat(score) * 100).toFixed(0)).join('#'); } else { GSI1SK += Object.values(audit.auditResult).join('#'); @@ -151,7 +151,7 @@ export default async function generateSampleData( ]); await createTablesFromSchema(); - const auditTypes = ['lhs', 'cwv']; + const auditTypes = ['lhs-mobile', 'cwv']; const sites = []; const auditItems = []; const latestAuditItems = []; diff --git a/packages/spacecat-shared-data-access/test/unit/models/audit.test.js b/packages/spacecat-shared-data-access/test/unit/models/audit.test.js index e1a3c82d8..c758ec6d8 100644 --- a/packages/spacecat-shared-data-access/test/unit/models/audit.test.js +++ b/packages/spacecat-shared-data-access/test/unit/models/audit.test.js @@ -18,7 +18,7 @@ import { createAudit } from '../../../src/models/audit.js'; const validData = { siteId: '123', auditedAt: new Date().toISOString(), - auditType: 'lhs', + auditType: 'lhs-mobile', auditResult: { performance: 0.9, seo: 0.9, diff --git a/packages/spacecat-shared-data-access/test/unit/service/audits/index.test.js b/packages/spacecat-shared-data-access/test/unit/service/audits/index.test.js index f60a01ab2..61e2f37ba 100644 --- a/packages/spacecat-shared-data-access/test/unit/service/audits/index.test.js +++ b/packages/spacecat-shared-data-access/test/unit/service/audits/index.test.js @@ -118,7 +118,7 @@ describe('Audit Access Pattern Tests', () => { it('successfully retrieves an audit for a site', async () => { const mockAuditData = [{ siteId: 'siteId', - auditType: 'lhs', + auditType: 'lhs-mobile', auditedAt: new Date().toISOString(), auditResult: { performance: 0.9, @@ -152,7 +152,7 @@ describe('Audit Access Pattern Tests', () => { const auditData = { siteId: 'siteId', - auditType: 'lhs', + auditType: 'lhs-mobile', auditedAt: new Date().toISOString(), auditResult: { performance: 0.9, @@ -219,7 +219,7 @@ describe('Audit Access Pattern Tests', () => { it('should remove all audits and latest audits for a site', async () => { const mockAuditData = [{ siteId: 'siteId', - auditType: 'lhs', + auditType: 'lhs-mobile', auditedAt: new Date().toISOString(), auditResult: { performance: 0.9, @@ -240,7 +240,7 @@ describe('Audit Access Pattern Tests', () => { it('should log an error if the removal fails', async () => { const mockAuditData = [{ siteId: 'siteId', - auditType: 'lhs', + auditType: 'lhs-mobile', auditedAt: new Date().toISOString(), auditResult: { performance: 0.9, diff --git a/packages/spacecat-shared-data-access/test/unit/service/sites/index.test.js b/packages/spacecat-shared-data-access/test/unit/service/sites/index.test.js index 457ff467f..9fb88f0e2 100644 --- a/packages/spacecat-shared-data-access/test/unit/service/sites/index.test.js +++ b/packages/spacecat-shared-data-access/test/unit/service/sites/index.test.js @@ -117,7 +117,7 @@ describe('Site Access Pattern Tests', () => { const mockAuditData = [{ siteId: 'site1', - auditType: 'lhs', + auditType: 'lhs-mobile', auditedAt: new Date().toISOString(), auditResult: { performance: 0.9, @@ -131,7 +131,7 @@ describe('Site Access Pattern Tests', () => { mockDynamoClient.query.onFirstCall().resolves(mockSiteData); mockDynamoClient.query.onSecondCall().resolves(mockAuditData); - const result = await exportedFunctions.getSitesWithLatestAudit('lhs'); + const result = await exportedFunctions.getSitesWithLatestAudit('lhs-mobile'); expect(result).to.be.an('array').that.has.lengthOf(1); }); @@ -177,7 +177,7 @@ describe('Site Access Pattern Tests', () => { const mockLatestAuditData = [{ siteId: 'site1', - auditType: 'lhs', + auditType: 'lhs-mobile', auditedAt: new Date().toISOString(), auditResult: { performance: 0.9, @@ -191,7 +191,7 @@ describe('Site Access Pattern Tests', () => { mockDynamoClient.query.onFirstCall().resolves(mockSiteData); mockDynamoClient.query.onSecondCall().resolves(mockLatestAuditData); - const result = await exportedFunctions.getSiteByBaseURLWithAuditInfo('https://example.com', 'lhs', true); + const result = await exportedFunctions.getSiteByBaseURLWithAuditInfo('https://example.com', 'lhs-mobile', true); const audits = result.getAudits(); expect(audits).to.be.an('array').with.lengthOf(1); @@ -212,7 +212,7 @@ describe('Site Access Pattern Tests', () => { const mockLatestAuditData = [{ siteId: 'site1', - auditType: 'lhs', + auditType: 'lhs-mobile', auditedAt: new Date().toISOString(), auditResult: { performance: 0.9, @@ -224,7 +224,7 @@ describe('Site Access Pattern Tests', () => { }, { siteId: 'site1', - auditType: 'lhs', + auditType: 'lhs-mobile', auditedAt: new Date().toISOString(), auditResult: { performance: 0.9, @@ -238,7 +238,7 @@ describe('Site Access Pattern Tests', () => { mockDynamoClient.query.onFirstCall().resolves(mockSiteData); mockDynamoClient.query.onSecondCall().resolves(mockLatestAuditData); - const result = await exportedFunctions.getSiteByBaseURLWithAuditInfo('baseUrl', 'lhs', false); + const result = await exportedFunctions.getSiteByBaseURLWithAuditInfo('baseUrl', 'lhs-mobile', false); const audits = result.getAudits(); expect(audits).to.be.an('array').with.lengthOf(2); From 12e586f2e09a0c660b65da1883b0bc549b165b1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominique=20J=C3=A4ggi?= Date: Sat, 2 Dec 2023 11:34:20 +0100 Subject: [PATCH 2/2] fix: default index export --- package-lock.json | 4 ++-- packages/spacecat-shared-data-access/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 860cfedcf..12b1aab76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12352,7 +12352,7 @@ }, "packages/spacecat-shared-data-access": { "name": "@adobe/spacecat-shared-data-access", - "version": "1.0.2", + "version": "1.1.0", "license": "Apache-2.0", "dependencies": { "@adobe/spacecat-shared-dynamo": "1.2.3", @@ -12385,7 +12385,7 @@ }, "packages/spacecat-shared-dynamo": { "name": "@adobe/spacecat-shared-dynamo", - "version": "1.2.2", + "version": "1.2.3", "license": "Apache-2.0", "dependencies": { "@adobe/spacecat-shared-utils": "1.1.0", diff --git a/packages/spacecat-shared-data-access/package.json b/packages/spacecat-shared-data-access/package.json index 3e47dde44..42e20069d 100644 --- a/packages/spacecat-shared-data-access/package.json +++ b/packages/spacecat-shared-data-access/package.json @@ -3,7 +3,7 @@ "version": "1.1.0", "description": "Shared modules of the Spacecat Services - Data Access", "type": "module", - "main": "src/service/index.js", + "main": "src/index.js", "types": "src/index.d.ts", "scripts": { "test:it": "mocha --spec \"test/it/**/*.test.js\"",