84 lines
2.5 KiB
TypeScript
84 lines
2.5 KiB
TypeScript
|
|
import { assertEquals } from '@std/assert'
|
||
|
|
import { type BlossomClient, uploadBlob } from '../src/core/blossom.ts'
|
||
|
|
import type { Signer } from '../src/core/signer.ts'
|
||
|
|
import type { UnsignedEvent } from '../src/core/event.ts'
|
||
|
|
import type { SignedEvent } from '../src/core/relays.ts'
|
||
|
|
|
||
|
|
function fakeSigner(): Signer {
|
||
|
|
return {
|
||
|
|
getPublicKey: () => Promise.resolve('p'),
|
||
|
|
signEvent: (ev: UnsignedEvent) =>
|
||
|
|
Promise.resolve({ ...ev, id: 'id', sig: 'sig', pubkey: 'p' } as SignedEvent),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
Deno.test('uploadBlob: pusht zu allen servern, gibt erste url zurück', async () => {
|
||
|
|
const data = new Uint8Array([1, 2, 3])
|
||
|
|
const client: BlossomClient = {
|
||
|
|
fetch: (url, _init) => {
|
||
|
|
return Promise.resolve(
|
||
|
|
new Response(JSON.stringify({ url: url + '/hash.png', sha256: 'hash' }), {
|
||
|
|
status: 200,
|
||
|
|
headers: { 'content-type': 'application/json' },
|
||
|
|
}),
|
||
|
|
)
|
||
|
|
},
|
||
|
|
}
|
||
|
|
const result = await uploadBlob({
|
||
|
|
data,
|
||
|
|
fileName: 'x.png',
|
||
|
|
mimeType: 'image/png',
|
||
|
|
servers: ['https://a.example', 'https://b.example'],
|
||
|
|
signer: fakeSigner(),
|
||
|
|
client,
|
||
|
|
})
|
||
|
|
assertEquals(result.ok.length, 2)
|
||
|
|
assertEquals(result.primaryUrl, 'https://a.example/upload/hash.png')
|
||
|
|
})
|
||
|
|
|
||
|
|
Deno.test('uploadBlob: akzeptiert wenn mindestens ein server ok', async () => {
|
||
|
|
const data = new Uint8Array([1])
|
||
|
|
const client: BlossomClient = {
|
||
|
|
fetch: (url) => {
|
||
|
|
if (url.startsWith('https://fail.example')) {
|
||
|
|
return Promise.resolve(new Response('nope', { status: 500 }))
|
||
|
|
}
|
||
|
|
return Promise.resolve(
|
||
|
|
new Response(JSON.stringify({ url: url + '/h.png', sha256: 'h' }), { status: 200 }),
|
||
|
|
)
|
||
|
|
},
|
||
|
|
}
|
||
|
|
const result = await uploadBlob({
|
||
|
|
data,
|
||
|
|
fileName: 'x.png',
|
||
|
|
mimeType: 'image/png',
|
||
|
|
servers: ['https://fail.example', 'https://ok.example'],
|
||
|
|
signer: fakeSigner(),
|
||
|
|
client,
|
||
|
|
})
|
||
|
|
assertEquals(result.ok, ['https://ok.example'])
|
||
|
|
assertEquals(result.failed, ['https://fail.example'])
|
||
|
|
})
|
||
|
|
|
||
|
|
Deno.test('uploadBlob: wirft wenn alle server ablehnen', async () => {
|
||
|
|
const data = new Uint8Array([1])
|
||
|
|
const client: BlossomClient = {
|
||
|
|
fetch: () => Promise.resolve(new Response('err', { status: 500 })),
|
||
|
|
}
|
||
|
|
let threw = false
|
||
|
|
try {
|
||
|
|
await uploadBlob({
|
||
|
|
data,
|
||
|
|
fileName: 'x.png',
|
||
|
|
mimeType: 'image/png',
|
||
|
|
servers: ['https://a.example'],
|
||
|
|
signer: fakeSigner(),
|
||
|
|
client,
|
||
|
|
})
|
||
|
|
} catch (err) {
|
||
|
|
threw = true
|
||
|
|
assertEquals(String(err).includes('all blossom servers failed'), true)
|
||
|
|
}
|
||
|
|
assertEquals(threw, true)
|
||
|
|
})
|