mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-25 22:34:56 +00:00
208 lines
7.8 KiB
Lua
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
|