You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
3.6 KiB
141 lines
3.6 KiB
import { describe, expect, it } from "vitest";
|
|
import { makeChannelSchema } from "./channel.ts";
|
|
import { fromByteArray } from "base64-js";
|
|
|
|
const mockRole = 0;
|
|
|
|
function makeBase64OfLength(len: number): string {
|
|
return fromByteArray(new Uint8Array(len));
|
|
}
|
|
|
|
describe("makeChannelSchema", () => {
|
|
const allowedBytes = 16;
|
|
const schema = makeChannelSchema(allowedBytes);
|
|
|
|
const validBase64 = makeBase64OfLength(allowedBytes);
|
|
|
|
const validSettings = {
|
|
channelNum: 3,
|
|
psk: validBase64,
|
|
name: "TestName",
|
|
id: 3,
|
|
uplinkEnabled: true,
|
|
downlinkEnabled: false,
|
|
moduleSettings: { positionPrecision: 10 },
|
|
};
|
|
|
|
it("accepts valid channel object", () => {
|
|
const result = schema.safeParse({
|
|
index: 0,
|
|
settings: validSettings,
|
|
role: mockRole,
|
|
});
|
|
expect(result.success).toBe(true);
|
|
});
|
|
|
|
it("rejects invalid base64 psk", () => {
|
|
const result = schema.safeParse({
|
|
index: 0,
|
|
settings: { ...validSettings, psk: "not_base64!" },
|
|
role: mockRole,
|
|
});
|
|
expect(result.success).toBe(false);
|
|
if (!result.success) {
|
|
expect(
|
|
result.error.issues.some((i) =>
|
|
i.path.includes("settings") && i.path.includes("psk")
|
|
),
|
|
).toBe(true);
|
|
}
|
|
});
|
|
|
|
it("rejects psk of wrong length", () => {
|
|
const wrongLength = makeBase64OfLength(8);
|
|
const result = schema.safeParse({
|
|
index: 0,
|
|
settings: { ...validSettings, psk: wrongLength },
|
|
role: mockRole,
|
|
});
|
|
expect(result.success).toBe(false);
|
|
if (!result.success) {
|
|
expect(
|
|
result.error.issues.some((i) =>
|
|
i.path.includes("settings") && i.path.includes("psk")
|
|
),
|
|
).toBe(true);
|
|
}
|
|
});
|
|
|
|
it("rejects name longer than 12 bytes", () => {
|
|
const longName = "a".repeat(13);
|
|
const result = schema.safeParse({
|
|
index: 0,
|
|
settings: { ...validSettings, name: longName },
|
|
role: mockRole,
|
|
});
|
|
expect(result.success).toBe(false);
|
|
if (!result.success) {
|
|
expect(
|
|
result.error.issues.some((i) =>
|
|
i.path.includes("settings") && i.path.includes("name")
|
|
),
|
|
).toBe(true);
|
|
}
|
|
});
|
|
|
|
it("rejects channelNum out of range", () => {
|
|
const result = schema.safeParse({
|
|
index: 0,
|
|
settings: { ...validSettings, channelNum: 10 },
|
|
role: mockRole,
|
|
});
|
|
expect(result.success).toBe(false);
|
|
if (!result.success) {
|
|
expect(
|
|
result.error.issues.some((i) =>
|
|
i.path.includes("settings") && i.path.includes("channelNum")
|
|
),
|
|
).toBe(true);
|
|
}
|
|
});
|
|
|
|
it("rejects missing required fields", () => {
|
|
const result = schema.safeParse({
|
|
index: 0,
|
|
settings: {},
|
|
role: mockRole,
|
|
});
|
|
expect(result.success).toBe(false);
|
|
if (!result.success) {
|
|
expect(result.error.issues.length).toBeGreaterThan(0);
|
|
}
|
|
});
|
|
|
|
it("accepts moduleSettings.positionPrecision as 0, 10-19, or 32", () => {
|
|
for (const val of [0, 10, 15, 19, 32]) {
|
|
const result = schema.safeParse({
|
|
index: 0,
|
|
settings: {
|
|
...validSettings,
|
|
moduleSettings: { positionPrecision: val },
|
|
},
|
|
role: mockRole,
|
|
});
|
|
expect(result.success).toBe(true);
|
|
}
|
|
});
|
|
|
|
it("rejects moduleSettings.positionPrecision out of range", () => {
|
|
for (const val of [9, 20, 31, 33]) {
|
|
const result = schema.safeParse({
|
|
index: 0,
|
|
settings: {
|
|
...validSettings,
|
|
moduleSettings: { positionPrecision: val },
|
|
},
|
|
role: mockRole,
|
|
});
|
|
expect(result.success).toBe(false);
|
|
}
|
|
});
|
|
});
|
|
|