|
| 1 | +/* eslint-disable @typescript-eslint/no-explicit-any */ |
| 2 | +import { describe, expect, it } from 'vitest'; |
| 3 | +import { LogLevel, MessageType } from '../enums'; |
| 4 | +import { getDeviceInfoResPayloadSchema, messageSchema, rawMessageSchema } from './schemas'; |
| 5 | + |
| 6 | +describe('schemas', () => { |
| 7 | + describe('messages', () => { |
| 8 | + const testCases: any[] = [ |
| 9 | + [{requestId:'req',type:MessageType.GetDeviceInfo, data: null}, true, ''], |
| 10 | + [{requestId:'req',type:MessageType.GetDeviceInfoRes, data: { id: 'id', name: 'name', connectionType: 'wifi' }}, true, ''], |
| 11 | + [{requestId:'req',type:MessageType.GetElements, data: null}, true, ''], |
| 12 | + [{requestId:'req',type:MessageType.GetElementsRes, data: 'html'}, true, ''], |
| 13 | + [{requestId:'req',type:MessageType.GetElementStyles, data:{ index: 1 }}, true, ''], |
| 14 | + [{requestId:'req',type:MessageType.GetElementStylesRes, data:{ index: 1, styles: {color:'red'} }}, true, ''], |
| 15 | + [{requestId:'req',type:MessageType.GetElementData, data:{ index: 1 }}, true, ''], |
| 16 | + [{requestId:'req',type:MessageType.GetElementDataRes, data:{ index: 1, data: {height:'100px'} }}, true, ''], |
| 17 | + [{requestId:'req',type:MessageType.GetStorage, data: {storageType: 'local'}}, true, ''], |
| 18 | + [{requestId:'req',type:MessageType.GetStorageRes, data: {storageType: 'local', data: {}}}, true, ''], |
| 19 | + [{requestId:'req',type:MessageType.SetStorage, data: {storageType: 'local', data: {}}}, true, ''], |
| 20 | + [{requestId:'req',type:MessageType.SetStorageRes, data: null}, true, ''], |
| 21 | + [{requestId:'req',type:MessageType.NewLog, data: {source: 'src', level: LogLevel.Info, data: ['1','2'], timestamp: '2024'}}, true, ''], |
| 22 | + [{requestId:'req',type:MessageType.ClearLogs, data: null}, true, ''], |
| 23 | + [{requestId:'req',type:MessageType.ClearLogsRes, data: null}, true, ''], |
| 24 | + [{requestId: null, type:MessageType.GetDeviceInfo, data: null}, false, 'requestId'], |
| 25 | + [{requestId:'req', type: null, data: null}, false, 'type'], |
| 26 | + [{requestId:'req', type:MessageType.GetDeviceInfoRes, data: { id: 'id', name: null, connectionType: 'wifi' }}, false, 'data'], |
| 27 | + [{requestId:'req', type:MessageType.GetElements, data: 123}, false, 'data'], |
| 28 | + [{requestId:'req', type:MessageType.GetElementsRes, data: null}, false, 'data'], |
| 29 | + [{requestId:'req', type:MessageType.GetElementStyles, data:{ index: [] }}, false, 'data'], |
| 30 | + [{requestId:'req', type:MessageType.GetElementStylesRes, data:{ index: 1, styles: null }}, false, 'data'], |
| 31 | + [{requestId:'req', type:MessageType.GetElementData, data: null}, false, 'data'], |
| 32 | + [{requestId:'req', type:MessageType.GetElementDataRes, data:{ index: 'abc', data: {height:'100px'} }}, false, 'data'], |
| 33 | + [{requestId:'req', type:MessageType.GetStorage, data: {storageType: 'other'}}, false, 'data'], |
| 34 | + [{requestId:'req', type:MessageType.GetStorageRes, data: {storageType: 'local', data: null}}, false, 'data'], |
| 35 | + [{requestId:'req', type:MessageType.SetStorage, data: {storageType: null, data: {}}}, false, 'data'], |
| 36 | + [{requestId:'req', type:MessageType.SetStorageRes, data: {prop:1}}, false, 'data'], |
| 37 | + [{requestId:'req', type:MessageType.NewLog, data: {source: 'src', level: 'other', data: ['1','2'], timestamp: '2024'}}, false, 'data'], |
| 38 | + [{requestId:'req', type:MessageType.ClearLogs, data: 123}, false, 'data'], |
| 39 | + [{requestId:'req', type:MessageType.ClearLogsRes, data: 'abc'}, false, 'data'] |
| 40 | + ]; |
| 41 | + |
| 42 | + it.each(testCases)(`should parse %s and return %s`, (data, success, errMsg) => { |
| 43 | + const result = messageSchema.safeParse(data); |
| 44 | + |
| 45 | + expect(result.success).toBe(success); |
| 46 | + if(success) { |
| 47 | + expect((result as any).data).toEqual(data); |
| 48 | + } else { |
| 49 | + expect((result as any).error.issues[0].path[0]).toEqual(errMsg); |
| 50 | + } |
| 51 | + }); |
| 52 | + |
| 53 | + it.each(testCases.map(a => ([ |
| 54 | + JSON.stringify(a[0]), |
| 55 | + a[1], |
| 56 | + a[2] |
| 57 | + ])))(`should parse %s and return %s`, (data, success, errMsg) => { |
| 58 | + const result = rawMessageSchema.safeParse(data); |
| 59 | + |
| 60 | + expect(result.success).toBe(success); |
| 61 | + if(success) { |
| 62 | + expect(JSON.stringify((result as any).data)).toEqual(data); |
| 63 | + } else { |
| 64 | + expect((result as any).error.issues[0].path[0]).toEqual(errMsg); |
| 65 | + } |
| 66 | + }); |
| 67 | + }); |
| 68 | + |
| 69 | + describe('getDeviceInfoResPayloadSchema', () => { |
| 70 | + it.each([ |
| 71 | + [{ id: 'id', name: 'name', connectionType: 'wifi' }, true], |
| 72 | + [{ id: 'id', name: 'name', connectionType: 'usb' }, true] |
| 73 | + ])(`should successfully parse %s`, (data, success) => { |
| 74 | + const result = getDeviceInfoResPayloadSchema.safeParse(data); |
| 75 | + |
| 76 | + expect(result.success).toBe(success); |
| 77 | + expect((result as any).data).toEqual(data); |
| 78 | + }); |
| 79 | + |
| 80 | + it.each([ |
| 81 | + [{ id: 'id', name: 'name', connectionType: 'other' }, false, 'connectionType'], |
| 82 | + [{ id: undefined, name: 'name', connectionType: 'usb' }, false, 'id'] |
| 83 | + ])(`should fail to parse %s`, (data, success, errMsg) => { |
| 84 | + const result = getDeviceInfoResPayloadSchema.safeParse(data); |
| 85 | + |
| 86 | + expect(result.success).toBe(success); |
| 87 | + expect((result as any).error.issues[0].path[0]).toEqual(errMsg); |
| 88 | + }); |
| 89 | + }); |
| 90 | +}); |
0 commit comments