import { describe, expect, test } from 'vitest';
import { serializeError } from './errors.models';

describe('errors models', () => {
  describe('serializeError', () => {
    test('when the prodived error is a true error instance concatenates the message and the stack', () => {
      const error = new Error('test');
      error.stack = 'Error: test\nstack';

      expect(serializeError({ error })).toBe('test\n\nError: test\nstack');
    });

    test('objects and arrays are serialized as JSON', () => {
      expect(serializeError({ error: { message: 'test', stack: 'Error: test\nstack' } })).toBe('{"message":"test","stack":"Error: test\\nstack"}');
      expect(serializeError({ error: ['foo', 'bar'] })).toBe('["foo","bar"]');
      expect(serializeError({ error: [1, 2, 3] })).toBe('[1,2,3]');
      expect(serializeError({ error: {} })).toBe('{}');
      expect(serializeError({ error: [] })).toBe('[]');
    });

    test('when the prodived error is something else, serializes it as a string', () => {
      expect(serializeError({ error: 'test' })).toBe('test');
      expect(serializeError({ error: 123 })).toBe('123');
      expect(serializeError({ error: true })).toBe('true');
      expect(serializeError({ error: false })).toBe('false');
      expect(serializeError({ error: null })).toBe('null');
      expect(serializeError({ error: undefined })).toBe('undefined');
    });
  });
});
