11import { beforeEach , describe , expect , it , vi } from "vitest" ;
22
33const mocks = vi . hoisted ( ( ) => ( {
4- existsSync : vi . fn ( ) ,
5- mkdirSync : vi . fn ( ) ,
6- readFileSync : vi . fn ( ) ,
7- writeFileSync : vi . fn ( ) ,
84 getRedisClient : vi . fn ( ) ,
95} ) ) ;
106
11- vi . mock ( "fs" , ( ) => ( {
12- existsSync : mocks . existsSync ,
13- mkdirSync : mocks . mkdirSync ,
14- readFileSync : mocks . readFileSync ,
15- writeFileSync : mocks . writeFileSync ,
16- } ) ) ;
17-
187vi . mock ( "../../../../src/cache/cache.js" , ( ) => ( {
198 getRedisClient : mocks . getRedisClient ,
209} ) ) ;
@@ -33,7 +22,6 @@ describe("keywordsStore", () => {
3322 delete process . env . REDIS_KEY_PREFIX ;
3423 delete process . env . KEYWORDS_FILE_PATH ;
3524 mocks . getRedisClient . mockResolvedValue ( null ) ;
36- mocks . existsSync . mockReturnValue ( false ) ;
3725 } ) ;
3826
3927 it ( "normaliza keywords removendo vazios e duplicadas" , async ( ) => {
@@ -80,27 +68,18 @@ describe("keywordsStore", () => {
8068 await expect ( loadKeywords ( [ "fallback" ] ) ) . resolves . toEqual ( [ "Suporte" , "Node" ] ) ;
8169 } ) ;
8270
83- it ( "lê do arquivo quando env está vazio e retorna [] para JSON inválido" , async ( ) => {
84- process . env . KEYWORDS_FILE_PATH = "./tmp/keywords.json" ;
85- mocks . existsSync . mockReturnValue ( true ) ;
86- mocks . readFileSync . mockReturnValueOnce ( JSON . stringify ( { KEYWORDS : [ "QA" , "QA" , "Node" ] } ) ) ;
87-
88- const { loadKeywords } = await importKeywordsStore ( ) ;
89-
90- await expect ( loadKeywords ( [ "fallback" ] ) ) . resolves . toEqual ( [ "QA" , "Node" ] ) ;
91- expect ( mocks . readFileSync ) . toHaveBeenCalledWith ( expect . stringContaining ( "keywords.json" ) , "utf-8" ) ;
92-
93- mocks . readFileSync . mockReturnValueOnce ( "{invalid-json" ) ;
94- await expect ( loadKeywords ( [ "fallback" ] ) ) . resolves . toEqual ( [ ] ) ;
95- } ) ;
96-
97- it ( "usa o fallback recebido quando não encontra Redis, env nem arquivo" , async ( ) => {
71+ it ( "usa o fallback recebido quando Redis está indisponível ou retorna JSON inválido" , async ( ) => {
9872 const { loadKeywords } = await importKeywordsStore ( ) ;
9973
10074 await expect ( loadKeywords ( [ " Produto " , "Produto" , "Dados " ] ) ) . resolves . toEqual ( [
10175 "Produto" ,
10276 "Dados" ,
10377 ] ) ;
78+
79+ const client = { get : vi . fn ( ) . mockResolvedValue ( "{invalid-json" ) } ;
80+ mocks . getRedisClient . mockResolvedValue ( client ) ;
81+
82+ await expect ( loadKeywords ( [ "QA" , "Dados" ] ) ) . resolves . toEqual ( [ "QA" , "Dados" ] ) ;
10483 } ) ;
10584
10685 it ( "salva no Redis usando a chave configurada" , async ( ) => {
@@ -114,28 +93,12 @@ describe("keywordsStore", () => {
11493 expect ( client . set ) . toHaveBeenCalledWith ( "vagas-full:keywords" , JSON . stringify ( [ "Node" , "React" ] ) ) ;
11594 } ) ;
11695
117- it ( "salva em SEARCH_KEYWORDS quando está em modo env e não há Redis" , async ( ) => {
118- process . env . KEYWORDS_STORAGE_MODE = "env" ;
119-
96+ it ( "retorna null para payload inválido e falha quando Redis está indisponível" , async ( ) => {
12097 const { saveKeywords } = await importKeywordsStore ( ) ;
12198
122- await expect ( saveKeywords ( [ "Backend" , "Java" , "Backend" ] ) ) . resolves . toEqual ( [ "Backend" , "Java" ] ) ;
123- expect ( process . env . SEARCH_KEYWORDS ) . toBe ( "Backend,Java" ) ;
12499 await expect ( saveKeywords ( "invalido" ) ) . resolves . toBeNull ( ) ;
125- } ) ;
126-
127- it ( "salva em arquivo quando está em modo file e não há Redis" , async ( ) => {
128- process . env . KEYWORDS_STORAGE_MODE = "file" ;
129- process . env . KEYWORDS_FILE_PATH = "./tmp/file-keywords.json" ;
130-
131- const { saveKeywords } = await importKeywordsStore ( ) ;
132-
133- await expect ( saveKeywords ( [ "SRE" , "Platform" ] ) ) . resolves . toEqual ( [ "SRE" , "Platform" ] ) ;
134- expect ( mocks . mkdirSync ) . toHaveBeenCalledWith ( expect . stringContaining ( "tmp" ) , { recursive : true } ) ;
135- expect ( mocks . writeFileSync ) . toHaveBeenCalledWith (
136- expect . stringContaining ( "file-keywords.json" ) ,
137- JSON . stringify ( { KEYWORDS : [ "SRE" , "Platform" ] } , null , 2 ) ,
138- "utf-8" ,
100+ await expect ( saveKeywords ( [ "Backend" , "Java" ] ) ) . rejects . toThrow (
101+ "Redis indisponivel para salvar keywords." ,
139102 ) ;
140103 } ) ;
141104} ) ;
0 commit comments