-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #20 from DesignLiquido/biblioteca-internet
Biblioteca internet
- Loading branch information
Showing
5 changed files
with
444 additions
and
209 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
import fetch from 'node-fetch'; | ||
import { createWriteStream } from 'fs'; | ||
import { resolve } from 'path'; | ||
|
||
let timeout: number = 2000; | ||
|
||
export async function definir_tempo_limite(time: number): Promise<void> { | ||
timeout = time; | ||
} | ||
|
||
export async function obter_texto(caminho: string): Promise<string> { | ||
try { | ||
const response = await fetch(caminho, { method: 'GET', timeout }); | ||
|
||
const conteudo = await response.text(); | ||
if (!conteudo) { | ||
throw new Error(`O caminho ${caminho} não tem nenhum conteúdo`); | ||
} | ||
|
||
return conteudo; | ||
} catch (error) { | ||
throw new Error(`Não foi possível obter o conteúdo de ${caminho}: ${error.message}`); | ||
} | ||
} | ||
|
||
export async function baixar_imagem(endereco: string, caminho: string): Promise<string> { | ||
let tipoDaImagem: string; | ||
let headerDaRequisicao: string; | ||
let imagemObtida: Buffer; | ||
let arquivo: string; | ||
|
||
try { | ||
tipoDaImagem = 'png'; | ||
headerDaRequisicao = (await fetch(endereco, { method: 'HEAD', timeout })).headers.get('content-type'); | ||
if (headerDaRequisicao.includes('image/png')) { | ||
tipoDaImagem = 'png'; | ||
} else if (headerDaRequisicao.includes('image/jpeg') || headerDaRequisicao.includes('image/jpg')) { | ||
tipoDaImagem = 'jpg'; | ||
} | ||
|
||
imagemObtida = await (await fetch(endereco, {method: 'GET', timeout})).buffer(); | ||
} catch (error) { | ||
throw new Error(`Não foi possível obter o conteúdo de ${endereco}`); | ||
} | ||
|
||
arquivo = resolve(caminho + `.${tipoDaImagem}`); | ||
try { | ||
await new Promise((resolve, reject) => { | ||
const stream = createWriteStream(arquivo); | ||
stream.on('finish', resolve); | ||
stream.on('error', reject); | ||
stream.write(imagemObtida); | ||
stream.end(); | ||
}); | ||
} catch (error) { | ||
throw new Error( | ||
`Não foi possível salvar a imagem em ${arquivo}\nGaranta que o caminho é válido e todas as pastas existem` | ||
); | ||
} | ||
|
||
return tipoDaImagem; | ||
} | ||
|
||
export async function endereco_disponivel(endereco: string): Promise<boolean> { | ||
try { | ||
const response = await fetch(endereco, { method: 'HEAD', timeout }); | ||
const status = response.status; | ||
|
||
if (status === 404 || status === 0) { | ||
return false; | ||
} | ||
|
||
return true; | ||
} catch (error) { | ||
return false; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,131 @@ | ||
import fetch, { Response } from 'node-fetch'; | ||
import fs from 'fs'; | ||
import { resolve } from 'path'; | ||
import { | ||
obter_texto, | ||
endereco_disponivel, | ||
definir_tempo_limite, | ||
baixar_imagem, | ||
} from '../../fontes/bibliotecas/internet'; | ||
jest.mock('node-fetch'); | ||
|
||
describe('Biblioteca Internet', () => { | ||
describe('Obter Texto', () => { | ||
it('Trivial', async () => { | ||
const caminho = 'https://example.com/texto.txt'; | ||
const conteudoEsperado = 'Conteúdo do arquivo'; | ||
(fetch as jest.MockedFunction<typeof fetch>).mockResolvedValueOnce({ | ||
text: jest.fn().mockResolvedValueOnce(conteudoEsperado), | ||
} as unknown as Response); | ||
|
||
const resultado = await obter_texto(caminho); | ||
expect(resultado).toBe(conteudoEsperado); | ||
}); | ||
|
||
it('Falha - Vazio', async () => { | ||
const caminho = 'https://example.com/vazio.txt'; | ||
(fetch as jest.MockedFunction<typeof fetch>).mockResolvedValueOnce({ | ||
text: jest.fn().mockResolvedValueOnce(''), | ||
} as unknown as Response); | ||
|
||
await expect(obter_texto(caminho)).rejects.toThrow(`O caminho ${caminho} não tem nenhum conteúdo`); | ||
}); | ||
|
||
it('Falha - Conteudo Inacessivel', async () => { | ||
const caminho = 'https://example.com/inexistente.txt'; | ||
(fetch as jest.MockedFunction<typeof fetch>).mockRejectedValueOnce(new Error('Failed to fetch')); | ||
|
||
await expect(obter_texto(caminho)).rejects.toThrow(`Não foi possível obter o conteúdo de ${caminho}`); | ||
}); | ||
}); | ||
describe('Baixar Imagem', () => { | ||
//Ajustar depois | ||
it.skip('Trivial', async () => { | ||
const endereco = 'https://example.com/imagem.jpg'; | ||
const caminho = './imagem'; | ||
const tipoDaImagem = 'jpg'; | ||
const imagemObtida = Buffer.from('Imagem de exemplo'); | ||
(fetch as jest.MockedFunction<typeof fetch>).mockResolvedValueOnce({ | ||
headers: { | ||
head: jest.fn().mockReturnValueOnce(`image/${tipoDaImagem}`), | ||
}, | ||
} as unknown as Response); | ||
(fetch as jest.MockedFunction<typeof fetch>).mockResolvedValueOnce({ | ||
buffer: jest.fn().mockResolvedValueOnce(imagemObtida), | ||
} as unknown as Response); | ||
const mockStreamWrite = jest.fn(); | ||
const mockStreamEnd = jest.fn(); | ||
jest.spyOn(fs, 'createWriteStream').mockReturnValueOnce({ | ||
write: mockStreamWrite, | ||
end: mockStreamEnd, | ||
} as unknown as fs.WriteStream); | ||
|
||
await baixar_imagem(endereco, caminho); | ||
expect(fs.createWriteStream).toHaveBeenCalledWith(resolve(caminho + `.${tipoDaImagem}`)); | ||
expect(mockStreamWrite).toHaveBeenCalledWith(imagemObtida); | ||
expect(mockStreamEnd).toHaveBeenCalled(); | ||
}); | ||
|
||
it('Falha - Imagem não encontrada', async () => { | ||
const endereco = 'https://example.com/inexistente.jpg'; | ||
const caminho = './imagem'; | ||
(fetch as jest.MockedFunction<typeof fetch>).mockRejectedValueOnce(new Error('Failed to fetch')); | ||
|
||
await expect(baixar_imagem(endereco, caminho)).rejects.toThrow( | ||
`Não foi possível obter o conteúdo de ${endereco}` | ||
); | ||
}); | ||
//Ajustar depois | ||
it.skip('Falha - Incapaz de salvar a imagem', async () => { | ||
const endereco = 'https://example.com/imagem.jpg'; | ||
const caminho = './imagem'; | ||
const tipoDaImagem = 'jpg'; | ||
const imagemObtida = Buffer.from('Imagem de exemplo'); | ||
(fetch as jest.MockedFunction<typeof fetch>).mockResolvedValueOnce({ | ||
headers: { | ||
get: jest.fn().mockReturnValueOnce(`image/${tipoDaImagem}`), | ||
}, | ||
buffer: jest.fn().mockResolvedValueOnce(imagemObtida), | ||
} as unknown as Response); | ||
jest.spyOn(fs, 'createWriteStream').mockImplementationOnce(() => { | ||
throw new Error('Failed to create write stream'); | ||
}); | ||
|
||
await expect(baixar_imagem(endereco, caminho)).rejects.toThrow( | ||
`Não foi possível salvar a imagem em ${resolve( | ||
caminho + `.${tipoDaImagem}` | ||
)}\nGaranta que o caminho é válido e todas as pastas existem` | ||
); | ||
}); | ||
}); | ||
|
||
describe('Endereço Disponível', () => { | ||
it('Trivial', async () => { | ||
const endereco = 'https://example.com/existente'; | ||
(fetch as jest.MockedFunction<typeof fetch>).mockResolvedValueOnce({ | ||
status: 200, | ||
} as unknown as Response); | ||
|
||
const resultado = await endereco_disponivel(endereco); | ||
expect(resultado).toBe(true); | ||
}); | ||
|
||
it('404', async () => { | ||
const endereco = 'https://example.com/inexistente'; | ||
(fetch as jest.MockedFunction<typeof fetch>).mockResolvedValueOnce({ | ||
status: 404, | ||
} as unknown as Response); | ||
|
||
const resultado = await endereco_disponivel(endereco); | ||
expect(resultado).toBe(false); | ||
}); | ||
|
||
it('Erro durante o fetch', async () => { | ||
const endereco = 'https://example.com/inacessivel'; | ||
(fetch as jest.MockedFunction<typeof fetch>).mockRejectedValueOnce(new Error('Failed to fetch')); | ||
|
||
const resultado = await endereco_disponivel(endereco); | ||
expect(resultado).toBe(false); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.