Skip to content

Commit

Permalink
feat: add site competitors entity
Browse files Browse the repository at this point in the history
  • Loading branch information
alinarublea committed Jan 24, 2025
1 parent 0e0664c commit d4ed2a6
Show file tree
Hide file tree
Showing 6 changed files with 103 additions and 1 deletion.
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ export interface Site extends BaseModel {
getOrganization(): Promise<Organization>;
getOrganizationId(): string;
getSiteCandidates(): Promise<SiteCandidate[]>;
getSiteCompetitors(): Promise<object>;
getSiteTopPages(): Promise<SiteTopPage[]>;
getSiteTopPagesBySource(source: string): Promise<SiteTopPage[]>;
getSiteTopPagesBySourceAndGeo(source: string, geo: string): Promise<SiteTopPage[]>;
Expand All @@ -65,6 +66,7 @@ export interface Site extends BaseModel {
setIsLive(isLive: boolean): Site;
setIsLiveToggledAt(isLiveToggledAt: string): Site;
setOrganizationId(organizationId: string): Site;
setSiteCompetitors(siteCompetitors: object): Site;
toggleLive(): Site;
}

Expand All @@ -77,4 +79,6 @@ export interface SiteCollection extends BaseCollection<Organization> {
findByBaseURL(baseURL: string): Promise<Site | null>;
findByDeliveryType(deliveryType: string): Promise<Site | null>;
findByOrganizationId(organizationId: string): Promise<Site | null>;
addSiteCompetitorBySiteId(siteId: string, siteCompetitorBaseUrl: string): Promise<void>;
removeSiteCompetitorBySiteId(siteId: string, siteCompetitorBaseUrl: string): Promise<void>;
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,33 @@ class SiteCollection extends BaseCollection {

return orderedSites;
}

async addSiteCompetitorBySiteId(siteId, siteCompetitorBaseURL) {
const site = await this.findById(siteId);
if (!site) {
throw new DataAccessError(`Site with id ${siteId} not found`, this);
}
const currentSiteCompetitors = site.getSiteCompetitors();
if (!currentSiteCompetitors.includes(siteCompetitorBaseURL)) {
currentSiteCompetitors.push(siteCompetitorBaseURL);
await site.save();
}
return site;
}

async removeSiteCompetitorBySiteId(siteId, siteCompetitorBaseURL) {
const site = await this.findById(siteId);
if (!site) {
throw new DataAccessError(`Site with id ${siteId} not found`, this);
}
const currentSiteCompetitors = site.getSiteCompetitors();
const indexOfSiteCompetitor = currentSiteCompetitors.indexOf(siteCompetitorBaseURL);
if (indexOfSiteCompetitor !== -1) {
currentSiteCompetitors.splice(indexOfSiteCompetitor, 1);
await site.save();
}
return site;
}
}

export default SiteCollection;
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,11 @@ const schema = new SchemaBuilder(Site, SiteCollection)
default: {},
validate: (value) => isObject(value),
})
.addAttribute('siteCompetitors', {
type: 'list',
default: [],
validate: (value) => Array.isArray(value),
})
.addAttribute('isLive', {
type: 'boolean',
required: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ async function checkSite(site) {
expect(site.getGitHubURL()).to.be.a('string');
expect(site.getHlxConfig()).to.be.an('object');
expect(site.getOrganizationId()).to.be.a('string');
expect(site.getSiteCompetitors()).to.be.an('array');
expect(isIsoDate(site.getCreatedAt())).to.be.true;
expect(isIsoDate(site.getUpdatedAt())).to.be.true;

Expand Down Expand Up @@ -287,6 +288,7 @@ describe('Site IT', async () => {
},
hlxVersion: 5,
},
siteCompetitors: ['https://competitor1.com', 'https://competitor2.com'],
organizationId: sampleData.organizations[0].getId(),
isLive: true,
isLiveToggledAt: '2024-12-06T08:35:24.125Z',
Expand All @@ -304,6 +306,7 @@ describe('Site IT', async () => {
await checkSite(newSite);

expect(newSite.getBaseURL()).to.equal(newSiteData.baseURL);
expect(newSite.getSiteCompetitors()).to.deep.equal(newSiteData.siteCompetitors);
});

it('updates a site', async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,4 +113,67 @@ describe('SiteCollection', () => {
expect(instance.allByDeliveryType).to.have.been.calledOnce;
});
});
describe('addSiteCompetitorBySiteId', () => {
it('adds a site competitor by site ID', async () => {
const siteId = 's12345';
const siteCompetitorBaseURL = 'https://competitor.com';
const siteCompetitors = [];
const mockSite = {
siteCompetitors: {},
getId: () => siteId,
getSiteCompetitors: () => (siteCompetitors),
save: stub().resolves(),
};

instance.findById = stub().resolves(mockSite);

const result = await instance.addSiteCompetitorBySiteId(siteId, siteCompetitorBaseURL);

expect(result).to.equal(mockSite);
expect(mockSite.getSiteCompetitors()).to.have.deep.equal([siteCompetitorBaseURL]);
expect(mockSite.save).to.have.been.calledOnce;
});

it('throws an error if site is not found', async () => {
const siteId = 's12345';
const siteCompetitorBaseURL = 'https://competitor.com';

instance.findById = stub().resolves(null);

await expect(instance.addSiteCompetitorBySiteId(siteId, siteCompetitorBaseURL))
.to.be.rejectedWith(`Site with id ${siteId} not found`);
});
});

describe('removeSiteCompetitorBySiteId', () => {
it('removes a site competitor by site ID', async () => {
const siteId = 's12345';
const siteCompetitorBaseURL1 = 'https://competitor1.com';
const siteCompetitorBaseURL2 = 'https://competitor2.com';
const siteCompetitors = [siteCompetitorBaseURL1, siteCompetitorBaseURL2];
const mockSite = {
getId: () => siteId,
getSiteCompetitors: () => (siteCompetitors),
save: stub().resolves(),
};

instance.findById = stub().resolves(mockSite);

const result = await instance.removeSiteCompetitorBySiteId(siteId, siteCompetitorBaseURL1);

expect(result).to.equal(mockSite);
expect(mockSite.getSiteCompetitors()).to.deep.equal([siteCompetitorBaseURL2]);
expect(mockSite.save).to.have.been.calledOnce;
});

it('throws an error if site is not found', async () => {
const siteId = 's12345';
const siteCompetitorBaseURL = 'https://competitor.com';

instance.findById = stub().resolves(null);

await expect(instance.removeSiteCompetitorBySiteId(siteId, siteCompetitorBaseURL))
.to.be.rejectedWith(`Site with id ${siteId} not found`);
});
});
});

0 comments on commit d4ed2a6

Please sign in to comment.