TUI is a doomed path. Stick with CLI

This commit is contained in:
2025-08-17 01:04:10 -05:00
parent f38eff12cd
commit 35960388cf
23 changed files with 6616 additions and 0 deletions

View File

@@ -0,0 +1,130 @@
/**
* Input Validator Tests
* Tests for comprehensive input validation
* Requirements: 5.4, 5.6
*/
const inputValidator = require("../../../src/tui/utils/inputValidator");
describe("InputValidator Tests", () => {
test("should validate operation type correctly", () => {
const validResult = inputValidator.validateField("operationType", "update");
expect(validResult.isValid).toBe(true);
expect(validResult.value).toBe("update");
const invalidResult = inputValidator.validateField(
"operationType",
"invalid"
);
expect(invalidResult.isValid).toBe(false);
expect(invalidResult.errors).toContain(
"operationType must be one of: update, rollback"
);
});
test("should validate scheduled time correctly", () => {
const futureDate = new Date(Date.now() + 86400000).toISOString();
const validResult = inputValidator.validateField(
"scheduledTime",
futureDate
);
expect(validResult.isValid).toBe(true);
const pastDate = new Date(Date.now() - 86400000).toISOString();
const invalidResult = inputValidator.validateField(
"scheduledTime",
pastDate
);
expect(invalidResult.isValid).toBe(false);
});
test("should validate shop domain correctly", () => {
const validDomain = "test-store.myshopify.com";
const validResult = inputValidator.validateField("shopDomain", validDomain);
expect(validResult.isValid).toBe(true);
const invalidDomain = "invalid domain";
const invalidResult = inputValidator.validateField(
"shopDomain",
invalidDomain
);
expect(invalidResult.isValid).toBe(false);
});
test("should validate price adjustment correctly", () => {
const validPercentage = 25.5;
const validResult = inputValidator.validateField(
"priceAdjustment",
validPercentage
);
expect(validResult.isValid).toBe(true);
expect(validResult.value).toBe(25.5);
const invalidPercentage = 1500; // Too high
const invalidResult = inputValidator.validateField(
"priceAdjustment",
invalidPercentage
);
expect(invalidResult.isValid).toBe(false);
});
test("should validate multiple fields", () => {
const data = {
operationType: "update",
scheduledTime: new Date(Date.now() + 86400000).toISOString(),
recurrence: "weekly",
description: "Test schedule",
};
const result = inputValidator.validateFields(data);
expect(result.isValid).toBe(true);
expect(result.data.operationType).toBe("update");
expect(result.data.recurrence).toBe("weekly");
});
test("should handle optional fields correctly", () => {
const data = {
operationType: "update",
scheduledTime: new Date(Date.now() + 86400000).toISOString(),
recurrence: "once",
// description is optional and missing
};
const result = inputValidator.validateFields(data);
expect(result.isValid).toBe(true);
expect(result.data.description).toBeUndefined();
});
test("should convert string numbers to numbers", () => {
const result = inputValidator.validateField("priceAdjustment", "25.5");
expect(result.isValid).toBe(true);
expect(result.value).toBe(25.5);
expect(typeof result.value).toBe("number");
});
test("should sanitize input strings", () => {
const dirtyInput = " test string with \x00 control chars ";
const sanitized = inputValidator.sanitizeInput(dirtyInput, {
trim: true,
removeControlChars: true,
});
expect(sanitized).toBe("test string with control chars");
});
test("should validate string length limits", () => {
const longDescription = "x".repeat(501);
const result = inputValidator.validateField("description", longDescription);
expect(result.isValid).toBe(false);
expect(
result.errors.some((error) => error.includes("500 characters"))
).toBe(true);
});
test("should validate required fields", () => {
const result = inputValidator.validateField("operationType", "");
expect(result.isValid).toBe(false);
expect(result.errors).toContain("operationType is required");
});
});