|
import type { Equals } from 'tsafe'; |
|
import { assert } from 'tsafe'; |
|
import { describe, expect, it } from 'vitest'; |
|
|
|
import { Err, ErrResult, Ok, OkResult, withResult, withResultAsync } from './result'; |
|
|
|
const promiseify = <T>(fn: () => T): (() => Promise<T>) => { |
|
return () => |
|
new Promise((resolve) => { |
|
resolve(fn()); |
|
}); |
|
}; |
|
|
|
describe('Result Utility Functions', () => { |
|
it('OkResult() should create an Ok result', () => { |
|
const result = OkResult(42); |
|
expect(result).toBeInstanceOf(Ok); |
|
expect(result.isOk()).toBe(true); |
|
expect(result.isErr()).toBe(false); |
|
expect(result.value).toBe(42); |
|
assert<Equals<Ok<number>, typeof result>>(result); |
|
}); |
|
|
|
it('ErrResult() should create an Err result', () => { |
|
const error = new Error('Something went wrong'); |
|
const result = ErrResult(error); |
|
expect(result).toBeInstanceOf(Err); |
|
expect(result.isOk()).toBe(false); |
|
expect(result.isErr()).toBe(true); |
|
expect(result.error).toBe(error); |
|
assert<Equals<Err<Error>, typeof result>>(result); |
|
}); |
|
|
|
it('withResult() should return Ok on success', () => { |
|
const fn = () => 42; |
|
const result = withResult(fn); |
|
expect(result.isOk()).toBe(true); |
|
if (result.isOk()) { |
|
expect(result.value).toBe(42); |
|
} |
|
}); |
|
|
|
it('withResult() should return Err on exception', () => { |
|
const fn = () => { |
|
throw new Error('Failure'); |
|
}; |
|
const result = withResult(fn); |
|
expect(result.isErr()).toBe(true); |
|
if (result.isErr()) { |
|
expect(result.error.message).toBe('Failure'); |
|
} |
|
}); |
|
|
|
it('withResultAsync() should return Ok on success', async () => { |
|
const fn = promiseify(() => 42); |
|
const result = await withResultAsync(fn); |
|
expect(result.isOk()).toBe(true); |
|
if (result.isOk()) { |
|
expect(result.value).toBe(42); |
|
} |
|
}); |
|
|
|
it('withResultAsync() should return Err on exception', async () => { |
|
const fn = promiseify(() => { |
|
throw new Error('Async failure'); |
|
}); |
|
const result = await withResultAsync(fn); |
|
expect(result.isErr()).toBe(true); |
|
if (result.isErr()) { |
|
expect(result.error.message).toBe('Async failure'); |
|
} |
|
}); |
|
}); |
|
|