diff --git a/src/server/cms/domain/cms.repository.ts b/src/server/cms/domain/cms.repository.ts index 1f43522984..ccefcb6866 100644 --- a/src/server/cms/domain/cms.repository.ts +++ b/src/server/cms/domain/cms.repository.ts @@ -1,7 +1,6 @@ import { Actualité } from '~/server/cms/domain/actualité'; import { AnnonceDeLogement } from '~/server/cms/domain/annonceDeLogement.type'; import { Article, ArticleSlug } from '~/server/cms/domain/article'; -import { Question, QuestionSlug } from '~/server/cms/domain/FAQ.type'; import { MentionsObligatoires } from '~/server/cms/domain/mentionsObligatoires'; import { MesureEmployeur } from '~/server/cms/domain/mesureEmployeur'; import { OffreDeStage, OffreDeStageDepot } from '~/server/cms/domain/offreDeStage.type'; @@ -12,16 +11,12 @@ import { Either } from '~/server/errors/either'; export interface CmsRepository { getActualitéList(): Promise> - getAllFAQ(): Promise>> - getAnnonceDeLogementBySlug(slug: string): Promise> getArticleBySlug(slug: ArticleSlug): Promise> getServiceJeuneList(): Promise>> - getFAQBySlug(slug: QuestionSlug): Promise> - getMentionObligatoire(mentionsObligatoires: MentionsObligatoires): Promise> getMesuresEmployeurs(): Promise> @@ -34,8 +29,6 @@ export interface CmsRepository { listAllArticleSlug(): Promise>> - listAllFAQSlug(): Promise>> - listAllOffreDeStageSlug(): Promise>> saveOffreDeStage(offre: OffreDeStageDepot): Promise> diff --git a/src/server/cms/infra/repositories/strapi.mapper.ts b/src/server/cms/infra/repositories/strapi.mapper.ts index d7b58762a6..c19e541878 100644 --- a/src/server/cms/infra/repositories/strapi.mapper.ts +++ b/src/server/cms/infra/repositories/strapi.mapper.ts @@ -1,14 +1,14 @@ -import { v4 as uuidv4 } from 'uuid' - -import { Actualité } from '~/server/cms/domain/actualité' -import { AnnonceDeLogement } from '~/server/cms/domain/annonceDeLogement.type' -import { Article } from '~/server/cms/domain/article' -import { Image } from '~/server/cms/domain/image' -import { MesureEmployeur } from '~/server/cms/domain/mesureEmployeur' -import { Domaines, OffreDeStage, OffreDeStageDepot, SourceDesDonnées } from '~/server/cms/domain/offreDeStage.type' -import { ServiceJeune } from '~/server/cms/domain/serviceJeune' -import { VideoCampagneApprentissage } from '~/server/cms/domain/videoCampagneApprentissage.type' -import { Strapi } from '~/server/cms/infra/repositories/strapi.response' +import { v4 as uuidv4 } from 'uuid'; + +import { Actualité } from '~/server/cms/domain/actualité'; +import { AnnonceDeLogement } from '~/server/cms/domain/annonceDeLogement.type'; +import { Article } from '~/server/cms/domain/article'; +import { Image } from '~/server/cms/domain/image'; +import { MesureEmployeur } from '~/server/cms/domain/mesureEmployeur'; +import { Domaines, OffreDeStage, OffreDeStageDepot, SourceDesDonnées } from '~/server/cms/domain/offreDeStage.type'; +import { ServiceJeune } from '~/server/cms/domain/serviceJeune'; +import { VideoCampagneApprentissage } from '~/server/cms/domain/videoCampagneApprentissage.type'; +import { Strapi } from '~/server/cms/infra/repositories/strapi.response'; export function mapArticle(articleResponse: Strapi.CollectionType.Article): Article { return { diff --git a/src/server/cms/infra/repositories/strapi.repository.fixture.ts b/src/server/cms/infra/repositories/strapi.repository.fixture.ts index a39221cc2a..c8886860f6 100644 --- a/src/server/cms/infra/repositories/strapi.repository.fixture.ts +++ b/src/server/cms/infra/repositories/strapi.repository.fixture.ts @@ -5,13 +5,11 @@ import { StrapiRepository } from './strapi.repository'; export function aStrapiCmsRepository(override?: Partial): CmsRepository { return { getActualitéList: jest.fn(), - getAllFAQ: jest.fn(), getAllVideosCampagneApprentissage: jest.fn(), getAnnonceDeLogementBySlug: jest.fn(), getArticleBySlug: jest.fn(), getCollectionType: jest.fn(), getCollectionTypeDeprecated: jest.fn(), - getFAQBySlug: jest.fn(), getFirstFromCollectionType: jest.fn(), getMentionObligatoire: jest.fn(), getMesuresEmployeurs: jest.fn(), @@ -19,7 +17,6 @@ export function aStrapiCmsRepository(override?: Partial): CmsR getServiceJeuneList: jest.fn(), listAllAnnonceDeLogementSlug: jest.fn(), listAllArticleSlug: jest.fn(), - listAllFAQSlug: jest.fn(), listAllOffreDeStageSlug: jest.fn(), save: jest.fn(), saveOffreDeStage: jest.fn(), diff --git a/src/server/cms/infra/repositories/strapi.repository.test.ts b/src/server/cms/infra/repositories/strapi.repository.test.ts index abba740deb..9712ef9fc5 100644 --- a/src/server/cms/infra/repositories/strapi.repository.test.ts +++ b/src/server/cms/infra/repositories/strapi.repository.test.ts @@ -1,18 +1,18 @@ -import { anOffreDeStageDepot } from '~/client/services/stage/stageService.fixture' -import { Actualité } from '~/server/cms/domain/actualité' -import { anActualite } from '~/server/cms/domain/actualite.fixture' -import { anAnnonceDeLogement, anAnnonceDeLogementResponse } from '~/server/cms/domain/annonceDeLogement.fixture' -import { AnnonceDeLogement } from '~/server/cms/domain/annonceDeLogement.type' -import { Article } from '~/server/cms/domain/article' -import { anArticle } from '~/server/cms/domain/article.fixture' -import { anUnorderedServiceJeuneList } from '~/server/cms/domain/espaceJeune.fixture' -import { MentionsObligatoires } from '~/server/cms/domain/mentionsObligatoires' -import { MesureEmployeur } from '~/server/cms/domain/mesureEmployeur' -import { aMesureEmployeurList } from '~/server/cms/domain/mesureEmployeur.fixture' -import { anOffreDeStage } from '~/server/cms/domain/offreDeStage.fixture' -import { OffreDeStage } from '~/server/cms/domain/offreDeStage.type' -import { ServiceJeune } from '~/server/cms/domain/serviceJeune' -import { VideoCampagneApprentissage } from '~/server/cms/domain/videoCampagneApprentissage.type' +import { anOffreDeStageDepot } from '~/client/services/stage/stageService.fixture'; +import { Actualité } from '~/server/cms/domain/actualité'; +import { anActualite } from '~/server/cms/domain/actualite.fixture'; +import { anAnnonceDeLogement, anAnnonceDeLogementResponse } from '~/server/cms/domain/annonceDeLogement.fixture'; +import { AnnonceDeLogement } from '~/server/cms/domain/annonceDeLogement.type'; +import { Article } from '~/server/cms/domain/article'; +import { anArticle } from '~/server/cms/domain/article.fixture'; +import { anUnorderedServiceJeuneList } from '~/server/cms/domain/espaceJeune.fixture'; +import { MentionsObligatoires } from '~/server/cms/domain/mentionsObligatoires'; +import { MesureEmployeur } from '~/server/cms/domain/mesureEmployeur'; +import { aMesureEmployeurList } from '~/server/cms/domain/mesureEmployeur.fixture'; +import { anOffreDeStage } from '~/server/cms/domain/offreDeStage.fixture'; +import { OffreDeStage } from '~/server/cms/domain/offreDeStage.type'; +import { ServiceJeune } from '~/server/cms/domain/serviceJeune'; +import { VideoCampagneApprentissage } from '~/server/cms/domain/videoCampagneApprentissage.type'; import { anActualiteFixture, anOffreDeStageDepotStrapi, @@ -26,25 +26,25 @@ import { aStrapiOffreDeStageSlugList, aStrapiSingleType, aStrapiVideosCampagneApprentissage, -} from '~/server/cms/infra/repositories/strapi.fixture' -import { StrapiRepository } from '~/server/cms/infra/repositories/strapi.repository' -import { createFailure, createSuccess, Failure, Success } from '~/server/errors/either' -import { ErreurMetier } from '~/server/errors/erreurMetier.types' -import { aLogInformation, anErrorManagementService } from '~/server/services/error/errorManagement.fixture' -import { Severity } from '~/server/services/error/errorManagement.service' -import { AuthenticatedHttpClientService } from '~/server/services/http/authenticatedHttpClient.service' -import { anHttpError } from '~/server/services/http/httpError.fixture' -import { PublicHttpClientService } from '~/server/services/http/publicHttpClient.service' +} from '~/server/cms/infra/repositories/strapi.fixture'; +import { StrapiRepository } from '~/server/cms/infra/repositories/strapi.repository'; +import { createFailure, createSuccess, Failure, Success } from '~/server/errors/either'; +import { ErreurMetier } from '~/server/errors/erreurMetier.types'; +import { aLogInformation, anErrorManagementService } from '~/server/services/error/errorManagement.fixture'; +import { Severity } from '~/server/services/error/errorManagement.service'; +import { AuthenticatedHttpClientService } from '~/server/services/http/authenticatedHttpClient.service'; +import { anHttpError } from '~/server/services/http/httpError.fixture'; +import { PublicHttpClientService } from '~/server/services/http/publicHttpClient.service'; import { anAuthenticatedHttpClientService, anAxiosResponse, aPublicHttpClientService, -} from '~/server/services/http/publicHttpClient.service.fixture' +} from '~/server/services/http/publicHttpClient.service.fixture'; import { anAnnonceDeLogementPathList, anArticlePathList, anOffreDeStagePathList, -} from '~/server/sitemap/domain/sitemap.fixture' +} from '~/server/sitemap/domain/sitemap.fixture'; jest.mock('uuid', () => ({ v4: () => '123456789' })); diff --git a/src/server/cms/infra/repositories/strapi.repository.ts b/src/server/cms/infra/repositories/strapi.repository.ts index 44eb828c47..df0b84694f 100644 --- a/src/server/cms/infra/repositories/strapi.repository.ts +++ b/src/server/cms/infra/repositories/strapi.repository.ts @@ -1,12 +1,12 @@ -import { Actualité } from '~/server/cms/domain/actualité' -import { AnnonceDeLogement } from '~/server/cms/domain/annonceDeLogement.type' -import { Article, ArticleSlug } from '~/server/cms/domain/article' -import { CmsRepository } from '~/server/cms/domain/cms.repository' -import { MentionsObligatoires } from '~/server/cms/domain/mentionsObligatoires' -import { MesureEmployeur } from '~/server/cms/domain/mesureEmployeur' -import { OffreDeStage, OffreDeStageDepot } from '~/server/cms/domain/offreDeStage.type' -import { ServiceJeune } from '~/server/cms/domain/serviceJeune' -import { VideoCampagneApprentissage } from '~/server/cms/domain/videoCampagneApprentissage.type' +import { Actualité } from '~/server/cms/domain/actualité'; +import { AnnonceDeLogement } from '~/server/cms/domain/annonceDeLogement.type'; +import { Article, ArticleSlug } from '~/server/cms/domain/article'; +import { CmsRepository } from '~/server/cms/domain/cms.repository'; +import { MentionsObligatoires } from '~/server/cms/domain/mentionsObligatoires'; +import { MesureEmployeur } from '~/server/cms/domain/mesureEmployeur'; +import { OffreDeStage, OffreDeStageDepot } from '~/server/cms/domain/offreDeStage.type'; +import { ServiceJeune } from '~/server/cms/domain/serviceJeune'; +import { VideoCampagneApprentissage } from '~/server/cms/domain/videoCampagneApprentissage.type'; import { mapAnnonceLogement, mapArticle, @@ -16,13 +16,13 @@ import { mapServiceJeuneList, mapStrapiListeActualités, mapVideoCampagneApprentissage, -} from '~/server/cms/infra/repositories/strapi.mapper' -import { Strapi } from '~/server/cms/infra/repositories/strapi.response' -import { createFailure, createSuccess, Either, isSuccess } from '~/server/errors/either' -import { ErreurMetier } from '~/server/errors/erreurMetier.types' -import { ErrorManagementService, Severity } from '~/server/services/error/errorManagement.service' -import { AuthenticatedHttpClientService } from '~/server/services/http/authenticatedHttpClient.service' -import { PublicHttpClientService } from '~/server/services/http/publicHttpClient.service' +} from '~/server/cms/infra/repositories/strapi.mapper'; +import { Strapi } from '~/server/cms/infra/repositories/strapi.response'; +import { createFailure, createSuccess, Either, isSuccess } from '~/server/errors/either'; +import { ErreurMetier } from '~/server/errors/erreurMetier.types'; +import { ErrorManagementService, Severity } from '~/server/services/error/errorManagement.service'; +import { AuthenticatedHttpClientService } from '~/server/services/http/authenticatedHttpClient.service'; +import { PublicHttpClientService } from '~/server/services/http/publicHttpClient.service'; const MAX_PAGINATION_SIZE = '100'; const RESOURCE_ARTICLE = 'articles'; diff --git a/src/server/faq/domain/FAQ.fixture.ts b/src/server/faq/domain/FAQ.fixture.ts index 83d5e28a2f..49e337735d 100644 --- a/src/server/faq/domain/FAQ.fixture.ts +++ b/src/server/faq/domain/FAQ.fixture.ts @@ -10,7 +10,7 @@ export const aListeDeQuestion = (): Array => { export const aQuestion = (override?: Partial): FAQ.Question => { return { problématique: 'Comment constituer un dossier locatif ?', - slug: 'question-slug', + slug: 'Comment-constituer-un-dossier-locatif ?', ...override, }; }; @@ -19,7 +19,7 @@ export const aQuestionEtReponse = (override?: Partial): F return { contenu: 'mon contenu explicatif', problématique: 'Comment constituer un dossier locatif ?', - slug: 'question-slug', + slug: 'Comment-constituer-un-dossier-locatif ?', ...override, }; }; diff --git a/src/server/faq/infra/strapiFAQ.fixture.ts b/src/server/faq/infra/strapiFAQ.fixture.ts index 1dd5344060..9cb031194f 100644 --- a/src/server/faq/infra/strapiFAQ.fixture.ts +++ b/src/server/faq/infra/strapiFAQ.fixture.ts @@ -15,3 +15,10 @@ export const aStrapiQuestion = (override?: Partial): ...override, }; }; + +export const aStrapiQuestionSlug = (override?: Partial): FAQResponseStrapi.QuestionSlug => { + return { + slug: 'Comment-constituer-un-dossier-locatif ?', + ...override, + }; +}; diff --git a/src/server/faq/infra/strapiFAQ.mapper.test.ts b/src/server/faq/infra/strapiFAQ.mapper.test.ts index cba635d4d4..bccfb2a559 100644 --- a/src/server/faq/infra/strapiFAQ.mapper.test.ts +++ b/src/server/faq/infra/strapiFAQ.mapper.test.ts @@ -1,9 +1,6 @@ -import { - aQuestion, - aQuestionEtReponse, -} from '~/server/faq/domain/FAQ.fixture'; +import { aQuestion, aQuestionEtReponse } from '~/server/faq/domain/FAQ.fixture'; import { aStrapiQuestion, aStrapiQuestionEtReponse } from '~/server/faq/infra/strapiFAQ.fixture'; -import { flatMapSlug, mapQuestion, mapQuestionRéponse } from '~/server/faq/infra/strapiFAQ.mapper'; +import { mapQuestion, mapQuestionRéponse } from '~/server/faq/infra/strapiFAQ.mapper'; describe('mapQuestion', () => { it('retourne le résultat formaté', () => { @@ -34,13 +31,3 @@ describe('mapQuestionRéponse', () => { })); }); }); - -describe('flatMapSlug', () => { - it('renvoie le slug', () => { - const result= flatMapSlug({ - slug: 'Comment-constituer-un-dossier-locatif-?', - }); - - expect(result).toEqual('Comment-constituer-un-dossier-locatif-?'); - }); -}); diff --git a/src/server/faq/infra/strapiFAQ.mapper.ts b/src/server/faq/infra/strapiFAQ.mapper.ts index b741712df3..a0f8797635 100644 --- a/src/server/faq/infra/strapiFAQ.mapper.ts +++ b/src/server/faq/infra/strapiFAQ.mapper.ts @@ -15,6 +15,3 @@ export const mapQuestion = (faq: FAQResponseStrapi.Question): FAQ.Question => { slug: faq.slug, }; }; - -export const flatMapSlug = (faq: FAQResponseStrapi.QuestionSlug): FAQ.Slug => faq.slug; - diff --git a/src/server/faq/infra/strapiFAQ.repository.test.ts b/src/server/faq/infra/strapiFAQ.repository.test.ts index da52287a30..a34a4a85dd 100644 --- a/src/server/faq/infra/strapiFAQ.repository.test.ts +++ b/src/server/faq/infra/strapiFAQ.repository.test.ts @@ -1,82 +1,137 @@ import { aStrapiCmsRepository } from '~/server/cms/infra/repositories/strapi.repository.fixture'; -import { createSuccess } from '~/server/errors/either'; -import { aListeDeQuestion, aListeFAQSlug, aQuestionEtReponse } from '~/server/faq/domain/FAQ.fixture'; -import { flatMapSlug, mapQuestion, mapQuestionRéponse } from '~/server/faq/infra/strapiFAQ.mapper'; +import { createFailure, createSuccess } from '~/server/errors/either'; +import { ErreurMetier } from '~/server/errors/erreurMetier.types'; +import { aQuestion, aQuestionEtReponse } from '~/server/faq/domain/FAQ.fixture'; +import { aStrapiQuestion, aStrapiQuestionEtReponse, aStrapiQuestionSlug } from '~/server/faq/infra/strapiFAQ.fixture'; import { StrapiFAQRepository } from '~/server/faq/infra/strapiFAQ.repository'; const RESOURCE_FAQ = 'faqs'; describe('getAllFAQ', () => { it('appelle le service strapi avec les bons paramètres', async () => { - const strapiCmsRepository = aStrapiCmsRepository(); - const strapiFAQRepository = new StrapiFAQRepository(strapiCmsRepository); + const strapiService = aStrapiCmsRepository(); + jest.spyOn(strapiService, 'getCollectionType').mockResolvedValue(createSuccess([aStrapiQuestion()])); + const strapiFAQRepository = new StrapiFAQRepository(strapiService); const query= 'fields[0]=problematique&fields[1]=slug'; await strapiFAQRepository.getAllFAQ(); - expect(strapiCmsRepository.getCollectionType).toHaveBeenCalledWith(RESOURCE_FAQ, query, mapQuestion); + expect(strapiService.getCollectionType).toHaveBeenCalledWith(RESOURCE_FAQ, query); }); describe('quand la liste des questions est trouvée', () => { it('renvoie la liste de questions', async () => { - const expected = aListeDeQuestion(); - const strapiCmsRepository = aStrapiCmsRepository({ getCollectionType: jest.fn() }); - const strapiFAQRepository = new StrapiFAQRepository(strapiCmsRepository); - jest.spyOn(strapiCmsRepository, 'getCollectionType').mockResolvedValue(createSuccess(expected)); + const strapiService = aStrapiCmsRepository(); + const strapiFAQRepository = new StrapiFAQRepository(strapiService); + const strapiQuestions = [ + aStrapiQuestion(), + aStrapiQuestion({ problematique: 'Que faire dans la vie ?', slug: 'que-faire-dans-la-vie' }), + ]; + jest.spyOn(strapiService, 'getCollectionType').mockResolvedValue(createSuccess(strapiQuestions)); + const expectedQuestions = createSuccess([ + aQuestion(), + aQuestion({ + problématique: 'Que faire dans la vie ?', + slug: 'que-faire-dans-la-vie', + })]); + + const result = await strapiFAQRepository.getAllFAQ(); + + expect(result).toStrictEqual(expectedQuestions); + }); + }); + + describe('quand la récupération de la liste des questions est en échec', () => { + it('relais l’échec du strapi service', async () => { + const strapiService = aStrapiCmsRepository(); + const strapiFAQRepository = new StrapiFAQRepository(strapiService); + const expectedStrapiFailure = createFailure(ErreurMetier.CONTENU_INDISPONIBLE); + jest.spyOn(strapiService, 'getCollectionType').mockResolvedValue(expectedStrapiFailure); const result = await strapiFAQRepository.getAllFAQ(); - expect(result).toEqual(createSuccess(expected)); + expect(result).toStrictEqual(expectedStrapiFailure); }); }); }); describe('getFAQBySlug', () => { it('appelle le service strapi avec les bons paramètres', async () => { - const strapiCmsRepository = aStrapiCmsRepository(); - const strapiFAQRepository = new StrapiFAQRepository(strapiCmsRepository); + const strapiService = aStrapiCmsRepository(); + jest.spyOn(strapiService, 'getFirstFromCollectionType').mockResolvedValueOnce(createSuccess(aStrapiQuestionEtReponse())); + const strapiFAQRepository = new StrapiFAQRepository(strapiService); const slug = 'slugName'; const query= 'filters[slug][$eq]=slugName'; await strapiFAQRepository.getFAQBySlug(slug); - expect(strapiCmsRepository.getFirstFromCollectionType).toHaveBeenCalledWith(RESOURCE_FAQ, query, mapQuestionRéponse); + expect(strapiService.getFirstFromCollectionType).toHaveBeenCalledWith(RESOURCE_FAQ, query); }); describe('quand la question est trouvée', () => { it('renvoie la question', async () => { - const expected = aQuestionEtReponse(); - const strapiCmsRepository = aStrapiCmsRepository({ getFirstFromCollectionType: jest.fn() }); - const strapiFAQRepository = new StrapiFAQRepository(strapiCmsRepository); - jest.spyOn(strapiCmsRepository, 'getFirstFromCollectionType').mockResolvedValue(createSuccess(expected)); + const strapiService = aStrapiCmsRepository(); + jest.spyOn(strapiService, 'getFirstFromCollectionType').mockResolvedValueOnce(createSuccess(aStrapiQuestionEtReponse())); + const strapiFAQRepository = new StrapiFAQRepository(strapiService); + const expectedQuestionEtReponse = aQuestionEtReponse(); + + const result = await strapiFAQRepository.getFAQBySlug('slugName'); + + expect(result).toStrictEqual(createSuccess(expectedQuestionEtReponse)); + }); + }); + + describe('quand la récupération est en échec', () => { + it('relais l’échec du strapi service', async () => { + const strapiService = aStrapiCmsRepository(); + const expectedFailure = createFailure(ErreurMetier.CONTENU_INDISPONIBLE); + jest.spyOn(strapiService, 'getFirstFromCollectionType').mockResolvedValueOnce(expectedFailure); + const strapiFAQRepository = new StrapiFAQRepository(strapiService); const result = await strapiFAQRepository.getFAQBySlug('slugName'); - expect(result).toEqual(createSuccess(expected)); + expect(result).toStrictEqual(expectedFailure); }); }); }); describe('listAllFAQSlug', () => { it('appelle le service strapi avec les bons paramètres', async () => { - const strapiCmsRepository = aStrapiCmsRepository(); - const strapiFAQRepository = new StrapiFAQRepository(strapiCmsRepository); + const strapiService = aStrapiCmsRepository(); + jest.spyOn(strapiService, 'getCollectionType').mockResolvedValueOnce(createSuccess([aStrapiQuestionSlug()])); + const strapiFAQRepository = new StrapiFAQRepository(strapiService); const query= '[fields][0]=slug'; await strapiFAQRepository.listAllFAQSlug(); - expect(strapiCmsRepository.getCollectionType).toHaveBeenCalledWith(RESOURCE_FAQ, query, flatMapSlug); + expect(strapiService.getCollectionType).toHaveBeenCalledWith(RESOURCE_FAQ, query); }); describe('quand les slugs sont trouvés', () => { it('renvoie les slugs', async () => { - const expected = aListeFAQSlug(); - const strapiCmsRepository = aStrapiCmsRepository({ getCollectionType: jest.fn() }); + const strapiCmsRepository = aStrapiCmsRepository(); const strapiFAQRepository = new StrapiFAQRepository(strapiCmsRepository); - jest.spyOn(strapiCmsRepository, 'getCollectionType').mockResolvedValue(createSuccess(expected)); + jest.spyOn(strapiCmsRepository, 'getCollectionType').mockResolvedValue(createSuccess([ + aStrapiQuestionSlug(), + aStrapiQuestionSlug({ slug: 'comment-constituer-un-dossier-locatif-jeune' }), + ])); + const expectedSlugs = ['Comment-constituer-un-dossier-locatif ?', 'comment-constituer-un-dossier-locatif-jeune']; + + const result = await strapiFAQRepository.listAllFAQSlug(); + + expect(result).toStrictEqual(createSuccess(expectedSlugs)); + }); + }); + + describe('quand la récupération des slugs est en échec', () => { + it('relais l’échec du strapi service', async () => { + const strapiService = aStrapiCmsRepository(); + const strapiFAQRepository = new StrapiFAQRepository(strapiService); + const expectFailure = createFailure(ErreurMetier.CONTENU_INDISPONIBLE); + jest.spyOn(strapiService, 'getCollectionType').mockResolvedValue( expectFailure); const result = await strapiFAQRepository.listAllFAQSlug(); - expect(result).toEqual(createSuccess(expected)); + expect(result).toStrictEqual(expectFailure); }); }); }); diff --git a/src/server/faq/infra/strapiFAQ.repository.ts b/src/server/faq/infra/strapiFAQ.repository.ts index 479794e93a..0fbc66ba71 100644 --- a/src/server/faq/infra/strapiFAQ.repository.ts +++ b/src/server/faq/infra/strapiFAQ.repository.ts @@ -1,29 +1,46 @@ -import { StrapiRepository } from '~/server/cms/infra/repositories/strapi.repository'; -import { Either } from '~/server/errors/either'; +import { CmsRepository } from '~/server/cms/domain/cms.repository'; +import { createSuccess, Either, isSuccess } from '~/server/errors/either'; import { FAQ } from '~/server/faq/domain/FAQ'; import { FAQRepository } from '~/server/faq/domain/FAQ.repository'; import { FAQResponseStrapi } from '~/server/faq/infra/strapiFAQ'; -import { flatMapSlug, mapQuestion, mapQuestionRéponse } from '~/server/faq/infra/strapiFAQ.mapper'; +import { mapQuestion, mapQuestionRéponse } from '~/server/faq/infra/strapiFAQ.mapper'; const RESOURCE_FAQ = 'faqs'; export class StrapiFAQRepository implements FAQRepository { - constructor(private readonly strapiService: StrapiRepository) { + constructor(private readonly strapiService: CmsRepository) { } async getFAQBySlug(slug: string): Promise> { const query = `filters[slug][$eq]=${slug}`; - return await this.strapiService.getFirstFromCollectionType(RESOURCE_FAQ, query, mapQuestionRéponse); + const strapiQuestionEtReponse = await this.strapiService.getFirstFromCollectionType(RESOURCE_FAQ, query); + + if(isSuccess(strapiQuestionEtReponse)) + return createSuccess(mapQuestionRéponse(strapiQuestionEtReponse.result)); + + return strapiQuestionEtReponse; } async getAllFAQ(): Promise>> { const query = 'fields[0]=problematique&fields[1]=slug'; - return await this.strapiService.getCollectionType(RESOURCE_FAQ, query, mapQuestion); + const strapiQuestions = await this.strapiService.getCollectionType(RESOURCE_FAQ, query); + + if (isSuccess(strapiQuestions)) + return createSuccess(strapiQuestions.result.map((strapiQuestion) => mapQuestion(strapiQuestion))); + + return strapiQuestions; } async listAllFAQSlug(): Promise>> { const query = '[fields][0]=slug'; - return await this.strapiService.getCollectionType(RESOURCE_FAQ, query, flatMapSlug); + const strapiQuestionSlugs = await this.strapiService.getCollectionType(RESOURCE_FAQ, query); + + if (isSuccess(strapiQuestionSlugs)) { + return createSuccess(strapiQuestionSlugs.result.map((strapiQuestionSlug) => strapiQuestionSlug.slug)); + } + + return strapiQuestionSlugs; } + }