• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

nightconcept / almandine / 14748071543

30 Apr 2025 06:21AM UTC coverage: 68.293% (-12.0%) from 80.336%
14748071543

push

github

web-flow
fix: add (#13)

30 of 263 new or added lines in 4 files covered. (11.41%)

27 existing lines in 3 files now uncovered.

1344 of 1968 relevant lines covered (68.29%)

1.94 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.48
/src/spec/modules/add_spec.lua
1
--[[
2
  Add Module Specification
3

4
  Tests src/modules/add.lua
5
]]
6
--
7

8
--- Add module specification for Busted.
9
-- @module add_spec
10

11
local add_mod = require("modules.add")
1✔
12

13
return function()
NEW
14
  local describe = require("busted").describe
×
NEW
15
  local it = require("busted").it
×
NEW
16
  local assert = require("luassert")
×
NEW
17
  local stub = require("luassert.stub")
×
18

NEW
19
  describe("add_module", function()
×
20
    -- Helper functions
21
    local function make_fake_manifest()
NEW
22
      return {
×
23
        name = "test-project",
24
        type = "application",
25
        version = "0.0.1",
26
        license = "MIT",
27
        description = "Test manifest",
28
        scripts = {},
29
        dependencies = {},
30
      }
31
    end
32

33
    local function make_test_deps(manifest, save_manifest_fn, downloader_fn)
34
      local saved_manifest, save_called
35
      local saved_lockfile
NEW
36
      local deps = {
×
37
        load_manifest = function()
NEW
38
          return manifest, nil
×
39
        end,
NEW
40
        save_manifest = save_manifest_fn or function(m)
×
NEW
41
          saved_manifest = m
×
NEW
42
          save_called = true
×
NEW
43
          return true, nil
×
44
        end,
45
        ensure_lib_dir = function() end,
NEW
46
        downloader = {
×
NEW
47
          download = downloader_fn or function(_, _)
×
NEW
48
            return true, nil
×
49
          end,
50
        },
NEW
51
        hash_utils = {
×
52
          hash_dependency = function(dep)
53
            -- Extract hash from GitHub URL if present
NEW
54
            local url = type(dep) == "string" and dep or dep.url
×
NEW
55
            if url:match("github.com") then
×
NEW
56
              local hash = url:match("/blob/([0-9a-f]+)/")
×
NEW
57
              if hash then
×
NEW
58
                return hash, nil
×
59
              end
60
            end
NEW
61
            return "no_hash_found", "URL does not contain a commit hash"
×
62
          end,
63
        },
NEW
64
        lockfile = {
×
65
          generate_lockfile_table = function(deps)
NEW
66
            return { package = deps }
×
67
          end,
68
          write_lockfile = function(table)
NEW
69
            saved_lockfile = table
×
NEW
70
            return true, nil
×
71
          end,
72
        },
73
      }
NEW
74
      return deps,
×
75
        function()
NEW
76
          return saved_manifest
×
77
        end,
78
        function()
NEW
79
          return save_called
×
80
        end,
81
        function()
NEW
82
          return saved_lockfile
×
83
        end
84
    end
85

86
    -- Help info output
NEW
87
    it("help_info returns correct usage string", function()
×
NEW
88
      local help = add_mod.help_info()
×
NEW
89
      assert.is_true(type(help) == "string")
×
NEW
90
      assert.are.same(
×
91
        help,
NEW
92
        [[
×
93
Usage: almd add <source> [-d <dir>] [-n <dep_name>]
94

95
Options:
96
  -d <dir>     Destination directory for the installed file
97
  -n <name>    Name of the dependency (optional, inferred from URL if not provided)
98

99
Example:
100
  almd add https://example.com/lib.lua
101
  almd add https://example.com/lib.lua -d src/lib/custom
102
  almd add https://example.com/lib.lua -n mylib
NEW
103
]]
×
104
      )
105
    end)
106

107
    -- add_dependency functionality
NEW
108
    it("returns true when adding dependency successfully", function()
×
NEW
109
      local printed = {}
×
NEW
110
      local print_stub = stub(_G, "print", function(msg)
×
NEW
111
        table.insert(printed, tostring(msg))
×
112
      end)
113

114
      -- Mock dependencies
NEW
115
      local manifest = make_fake_manifest()
×
NEW
116
      local deps, _, get_save_called = make_test_deps(manifest)
×
NEW
117
      local success, err = add_mod.add_dependency("testdep", "http://example.com/test.lua", nil, deps)
×
118

NEW
119
      assert.is_true(success)
×
NEW
120
      assert.are.same(err, nil)
×
NEW
121
      assert.is_true(get_save_called())
×
NEW
122
      assert.are.same(#printed, 4)
×
NEW
123
      print_stub:revert()
×
124
    end)
125

NEW
126
    it("handles GitHub blob URLs by converting to raw URLs", function()
×
NEW
127
      local manifest = make_fake_manifest()
×
NEW
128
      local deps, get_saved_manifest, _, _ = make_test_deps(manifest)
×
NEW
129
      local ensure_lib_dir_called = false
×
NEW
130
      local downloader_called = false
×
131
      local download_url
132

133
      deps.ensure_lib_dir = function()
NEW
134
        ensure_lib_dir_called = true
×
135
      end
136

NEW
137
      deps.downloader.download = function(url, _)
×
NEW
138
        downloader_called = true
×
NEW
139
        download_url = url
×
NEW
140
        return true, nil
×
141
      end
142

NEW
143
      local blob_url = "https://github.com/Oval-Tutu/shove/blob/81f7f879a812e4479493a88e646831d0f0409560/shove.lua"
×
NEW
144
      local success, err = add_mod.add_dependency("shove", blob_url, nil, deps)
×
145

NEW
146
      assert.is_true(success)
×
NEW
147
      assert.are.same(err, nil)
×
NEW
148
      assert.is_true(ensure_lib_dir_called)
×
NEW
149
      assert.is_true(downloader_called)
×
NEW
150
      local expected_raw_url = "https://raw.githubusercontent.com/Oval-Tutu/shove/"
×
NEW
151
        .. "81f7f879a812e4479493a88e646831d0f0409560/shove.lua"
×
NEW
152
      assert.are.same(download_url, expected_raw_url)
×
153

154
      -- Verify manifest stores the blob URL
NEW
155
      local saved_manifest = get_saved_manifest()
×
NEW
156
      assert.are.same(saved_manifest.dependencies.shove, blob_url)
×
157
    end)
158

NEW
159
    it("handles GitHub raw URLs directly", function()
×
NEW
160
      local manifest = make_fake_manifest()
×
NEW
161
      local deps, get_saved_manifest, _ = make_test_deps(manifest)
×
NEW
162
      local ensure_lib_dir_called = false
×
NEW
163
      local downloader_called = false
×
164
      local download_url
165

166
      deps.ensure_lib_dir = function()
NEW
167
        ensure_lib_dir_called = true
×
168
      end
169

NEW
170
      deps.downloader.download = function(url, _)
×
NEW
171
        downloader_called = true
×
NEW
172
        download_url = url
×
NEW
173
        return true, nil
×
174
      end
175

NEW
176
      local raw_url = "https://raw.githubusercontent.com/Oval-Tutu/shove/"
×
NEW
177
        .. "81f7f879a812e4479493a88e646831d0f0409560/shove.lua"
×
NEW
178
      local success, err = add_mod.add_dependency("shove", raw_url, nil, deps)
×
179

NEW
180
      assert.is_true(success)
×
NEW
181
      assert.are.same(err, nil)
×
NEW
182
      assert.is_true(ensure_lib_dir_called)
×
NEW
183
      assert.is_true(downloader_called)
×
NEW
184
      assert.are.same(download_url, raw_url)
×
185

186
      -- Verify manifest stores the raw URL
NEW
187
      local saved_manifest = get_saved_manifest()
×
NEW
188
      assert.are.same(saved_manifest.dependencies.shove, raw_url)
×
189
    end)
190

NEW
191
    it("adds a simple dependency and stores git hash in lockfile", function()
×
NEW
192
      local manifest = make_fake_manifest()
×
NEW
193
      local deps, get_saved_manifest, get_save_called, get_saved_lockfile = make_test_deps(manifest)
×
NEW
194
      local ensure_lib_dir_called = false
×
NEW
195
      local downloader_called = false
×
NEW
196
      local downloader_args = {}
×
NEW
197
      deps.downloader.download = function(url, out_path)
×
UNCOV
198
        downloader_called = true
×
UNCOV
199
        downloader_args.url = url
×
UNCOV
200
        downloader_args.out_path = out_path
×
UNCOV
201
        return true, nil
×
202
      end
203
      deps.ensure_lib_dir = function()
NEW
204
        ensure_lib_dir_called = true
×
205
      end
206

NEW
207
      local dep_name = "shove"
×
NEW
208
      local dep_url = "https://github.com/Oval-Tutu/shove/blob/81f7f879a812e4479493a88e646831d0f0409560/shove.lua"
×
NEW
209
      local _, _ = add_mod.add_dependency(dep_name, dep_url, nil, deps)
×
210

211
      -- Verify manifest updates
NEW
212
      assert.is_true(get_save_called())
×
NEW
213
      assert.are.same(get_saved_manifest().dependencies[dep_name], dep_url)
×
NEW
214
      assert.is_true(ensure_lib_dir_called)
×
NEW
215
      assert.is_true(downloader_called)
×
NEW
216
      local expected_raw_url = "https://raw.githubusercontent.com/Oval-Tutu/shove/"
×
NEW
217
        .. "81f7f879a812e4479493a88e646831d0f0409560/shove.lua"
×
NEW
218
      assert.are.same(downloader_args.url, expected_raw_url)
×
NEW
219
      assert.are.same(downloader_args.out_path, "shove.lua")
×
220

221
      -- Verify lockfile
NEW
222
      assert.is_true(get_saved_lockfile() ~= nil)
×
NEW
223
      assert.are.same(get_saved_lockfile().package[dep_name].hash, "81f7f879a812e4479493a88e646831d0f0409560")
×
224
    end)
225

NEW
226
    it("adds a dependency from a table source", function()
×
NEW
227
      local manifest = make_fake_manifest()
×
NEW
228
      local deps, get_saved_manifest = make_test_deps(manifest)
×
NEW
229
      local downloader_args = {}
×
NEW
230
      deps.downloader.download = function(url, out_path)
×
UNCOV
231
        downloader_args.url = url
×
UNCOV
232
        downloader_args.out_path = out_path
×
UNCOV
233
        return true, nil
×
234
      end
235

NEW
236
      local dep_name = "bar"
×
NEW
237
      local dep_source = {
×
238
        url = "https://github.com/owner/repo/blob/abcdef1234567890/bar.lua",
239
        path = "custom/bar.lua",
240
      }
NEW
241
      local _, _ = add_mod.add_dependency(dep_name, dep_source, nil, deps)
×
242

NEW
243
      assert.are.same(get_saved_manifest().dependencies[dep_name], dep_source)
×
NEW
244
      assert.are.equal(downloader_args.url, dep_source.url)
×
NEW
245
      assert.are.equal(downloader_args.out_path, "custom/bar.lua")
×
246
    end)
247

NEW
248
    it("infers name from URL if not provided", function()
×
NEW
249
      local manifest = make_fake_manifest()
×
NEW
250
      local deps, get_saved_manifest, get_save_called = make_test_deps(manifest)
×
NEW
251
      local ensure_lib_dir_called = false
×
NEW
252
      local downloader_called = false
×
NEW
253
      local downloader_args = {}
×
NEW
254
      deps.downloader.download = function(url, out_path)
×
UNCOV
255
        downloader_called = true
×
UNCOV
256
        downloader_args.url = url
×
UNCOV
257
        downloader_args.out_path = out_path
×
UNCOV
258
        return true, nil
×
259
      end
260
      deps.ensure_lib_dir = function()
NEW
261
        ensure_lib_dir_called = true
×
262
      end
263

NEW
264
      local dep_url = "https://github.com/owner/repo/blob/abcdef1234567890/baz.lua"
×
NEW
265
      local _, _ = add_mod.add_dependency(nil, dep_url, nil, deps)
×
266

NEW
267
      assert.is_true(get_save_called())
×
NEW
268
      assert.are.equal(get_saved_manifest().dependencies["baz"], dep_url)
×
NEW
269
      assert.is_true(ensure_lib_dir_called)
×
NEW
270
      assert.is_true(downloader_called)
×
NEW
271
      local expected_raw_url = "https://raw.githubusercontent.com/owner/repo/abcdef1234567890/baz.lua"
×
NEW
272
      assert.are.equal(downloader_args.url, expected_raw_url)
×
NEW
273
      assert.are.equal(downloader_args.out_path, "baz.lua")
×
274
    end)
275

NEW
276
    it("prints error and returns if manifest fails to load", function()
×
NEW
277
      local deps = {
×
278
        load_manifest = function()
NEW
279
          return nil, "manifest load error"
×
280
        end,
281
        save_manifest = function()
NEW
282
          return true, nil
×
283
        end,
284
        ensure_lib_dir = function() end,
NEW
285
        downloader = {
×
286
          download = function()
NEW
287
            return true, nil
×
288
          end,
289
        },
NEW
290
        hash_utils = {
×
291
          hash_dependency = function()
NEW
292
            return "hash123", nil
×
293
          end,
294
        },
NEW
295
        lockfile = {
×
296
          generate_lockfile_table = function()
NEW
297
            return {}
×
298
          end,
299
          write_lockfile = function()
NEW
300
            return true, nil
×
301
          end,
302
        },
303
      }
304

NEW
305
      local printed = {}
×
NEW
306
      stub(_G, "print", function(msg)
×
NEW
307
        table.insert(printed, tostring(msg))
×
308
      end)
NEW
309
      assert.has_no.errors(function()
×
NEW
310
        add_mod.add_dependency("testdep", "http://example.com/test.lua", nil, deps)
×
311
      end)
NEW
312
      assert.is_true(table.concat(printed, "\n"):match("manifest load error") ~= nil)
×
313
    end)
314

NEW
315
    it("prints error and returns if dep_name cannot be inferred from bad URL", function()
×
NEW
316
      local manifest = { dependencies = {} }
×
NEW
317
      local deps = make_test_deps(manifest)
×
NEW
318
      local save_manifest_called = false
×
319
      deps.save_manifest = function()
NEW
320
        save_manifest_called = true
×
321
      end
322

NEW
323
      local printed = {}
×
NEW
324
      stub(_G, "print", function(msg)
×
NEW
325
        table.insert(printed, tostring(msg))
×
326
      end)
NEW
327
      assert.has_no.errors(function()
×
NEW
328
        add_mod.add_dependency(nil, "https://example.com/", nil, deps)
×
329
      end)
NEW
330
      assert.is_true(table.concat(printed, "\n"):match("Could not infer dependency name") ~= nil)
×
NEW
331
      assert.is_false(save_manifest_called)
×
332
    end)
333

NEW
334
    it("prints error and returns if save_manifest fails", function()
×
NEW
335
      local manifest = { dependencies = {} }
×
NEW
336
      local deps = make_test_deps(manifest, function()
×
NEW
337
        return false, "save failed"
×
338
      end)
339

NEW
340
      local printed = {}
×
NEW
341
      stub(_G, "print", function(msg)
×
NEW
342
        table.insert(printed, tostring(msg))
×
343
      end)
NEW
344
      assert.has_no.errors(function()
×
NEW
345
        add_mod.add_dependency("foo", "url", nil, deps)
×
346
      end)
NEW
347
      assert.is_true(table.concat(printed, "\n"):match("save failed") ~= nil)
×
348
    end)
349

NEW
350
    it("prints error if downloader fails", function()
×
NEW
351
      local manifest = { dependencies = {} }
×
NEW
352
      local deps = make_test_deps(manifest, nil, function()
×
UNCOV
353
        return false, "download failed"
×
354
      end)
355

NEW
356
      local printed = {}
×
NEW
357
      stub(_G, "print", function(msg)
×
NEW
358
        table.insert(printed, tostring(msg))
×
359
      end)
NEW
360
      assert.has_no.errors(function()
×
NEW
361
        add_mod.add_dependency("foo", "url", nil, deps)
×
362
      end)
NEW
363
      local output = table.concat(printed, "\n")
×
NEW
364
      assert.is_true(output:match("Failed to download") ~= nil)
×
NEW
365
      assert.is_true(output:match("download failed") ~= nil)
×
366
    end)
367

NEW
368
    it("does not fail when no dependency is given", function()
×
NEW
369
      local manifest = make_fake_manifest()
×
NEW
370
      local deps = make_test_deps(manifest, function()
×
NEW
371
        error("Should not be called")
×
372
      end)
373

NEW
374
      assert.has_no.errors(function()
×
NEW
375
        add_mod.add_dependency(nil, nil, nil, deps)
×
376
      end)
377
    end)
378
  end)
379
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc