Files
metabuilder/packages/codegen_studio/seed/scripts/tests/zip_plan.test.lua
2025-12-30 13:20:59 +00:00

208 lines
7.8 KiB
Lua

-- Tests for zip_plan.lua functions
-- Tests prepare_zip function for generating zip entries
local M = {}
---@param framework TestFramework
---@param assertions AssertionsModule
---@param mocks MocksModule
function M.defineTests(framework, assertions, mocks)
local describe = framework.describe
local it = framework.it
local it_each = framework.it_each
local beforeEach = framework.beforeEach
local expect = assertions.expect
local zip_plan = require("zip_plan")
describe("zip_plan", function()
describe("prepare_zip", function()
describe("name handling", function()
it_each({
{ name = "my-project", expected = "my-project", desc = "custom name" },
{ name = "test-app", expected = "test-app", desc = "another custom name" },
{ name = nil, expected = "project", desc = "nil defaults to project" }
})("should use '$expected' for $desc", function(tc)
local blueprint = { name = tc.name, files = {} }
local result = zip_plan.prepare_zip(blueprint)
expect(result.name).toBe(tc.expected)
end)
end)
describe("files handling", function()
it("should return empty entries for empty files array", function()
local blueprint = { name = "test", files = {} }
local result = zip_plan.prepare_zip(blueprint)
expect(#result.entries).toBe(0)
end)
it("should return empty entries when files is nil", function()
local blueprint = { name = "test" }
local result = zip_plan.prepare_zip(blueprint)
expect(#result.entries).toBe(0)
end)
it_each({
{ file_count = 1, desc = "single file" },
{ file_count = 3, desc = "three files" },
{ file_count = 5, desc = "five files" },
{ file_count = 10, desc = "ten files" }
})("should create $file_count entries for $desc", function(tc)
local files = {}
for i = 1, tc.file_count do
table.insert(files, { path = "file" .. i .. ".txt", content = "content" })
end
local blueprint = { name = "test", files = files }
local result = zip_plan.prepare_zip(blueprint)
expect(#result.entries).toBe(tc.file_count)
end)
end)
describe("entry path mapping", function()
it("should preserve file paths in entries", function()
local blueprint = {
name = "test",
files = {
{ path = "src/index.ts", content = "code" },
{ path = "README.md", content = "readme" }
}
}
local result = zip_plan.prepare_zip(blueprint)
expect(result.entries[1].path).toBe("src/index.ts")
expect(result.entries[2].path).toBe("README.md")
end)
it_each({
{ path = "simple.txt", desc = "simple filename" },
{ path = "dir/file.txt", desc = "one level deep" },
{ path = "a/b/c/d.txt", desc = "multiple levels deep" },
{ path = "file with spaces.txt", desc = "filename with spaces" },
{ path = ".hidden", desc = "hidden file" }
})("should handle $desc path", function(tc)
local blueprint = {
name = "test",
files = { { path = tc.path, content = "test" } }
}
local result = zip_plan.prepare_zip(blueprint)
expect(result.entries[1].path).toBe(tc.path)
end)
end)
describe("content size calculation", function()
it_each({
{ content = "", expected_size = 0, desc = "empty content" },
{ content = "a", expected_size = 1, desc = "single character" },
{ content = "hello", expected_size = 5, desc = "short string" },
{ content = "hello world", expected_size = 11, desc = "string with space" },
{ content = "line1\nline2", expected_size = 11, desc = "multiline string" }
})("should calculate size $expected_size for $desc", function(tc)
local blueprint = {
name = "test",
files = { { path = "test.txt", content = tc.content } }
}
local result = zip_plan.prepare_zip(blueprint)
expect(result.entries[1].size).toBe(tc.expected_size)
end)
it("should handle nil content as empty string", function()
local blueprint = {
name = "test",
files = { { path = "test.txt", content = nil } }
}
local result = zip_plan.prepare_zip(blueprint)
expect(result.entries[1].size).toBe(0)
end)
it("should calculate size for longer content", function()
local content = string.rep("a", 1000)
local blueprint = {
name = "test",
files = { { path = "test.txt", content = content } }
}
local result = zip_plan.prepare_zip(blueprint)
expect(result.entries[1].size).toBe(1000)
end)
end)
describe("complete blueprint handling", function()
it("should process realistic blueprint", function()
local blueprint = {
name = "my-app",
files = {
{ path = "my-app/README.md", content = "# my-app\n\nDescription\n" },
{ path = "my-app/package.json", content = '{\n "name": "my-app"\n}\n' },
{ path = "my-app/src/index.ts", content = "console.log('hello');\n" }
}
}
local result = zip_plan.prepare_zip(blueprint)
expect(result.name).toBe("my-app")
expect(#result.entries).toBe(3)
-- Verify all paths preserved
expect(result.entries[1].path).toBe("my-app/README.md")
expect(result.entries[2].path).toBe("my-app/package.json")
expect(result.entries[3].path).toBe("my-app/src/index.ts")
-- Verify sizes calculated
expect(result.entries[1].size).toBeGreaterThan(0)
expect(result.entries[2].size).toBeGreaterThan(0)
expect(result.entries[3].size).toBeGreaterThan(0)
end)
it("should handle mixed content with nil and empty strings", function()
local blueprint = {
name = "test",
files = {
{ path = "file1.txt", content = "content" },
{ path = "file2.txt", content = nil },
{ path = "file3.txt", content = "" },
{ path = "file4.txt", content = "more content" }
}
}
local result = zip_plan.prepare_zip(blueprint)
expect(#result.entries).toBe(4)
expect(result.entries[1].size).toBe(7)
expect(result.entries[2].size).toBe(0)
expect(result.entries[3].size).toBe(0)
expect(result.entries[4].size).toBe(12)
end)
end)
describe("entry order preservation", function()
it("should maintain file order in entries", function()
local blueprint = {
name = "test",
files = {
{ path = "first.txt", content = "1" },
{ path = "second.txt", content = "2" },
{ path = "third.txt", content = "3" }
}
}
local result = zip_plan.prepare_zip(blueprint)
expect(result.entries[1].path).toBe("first.txt")
expect(result.entries[2].path).toBe("second.txt")
expect(result.entries[3].path).toBe("third.txt")
end)
end)
end)
end)
end
return M