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

nightconcept / almandine / 14748358210

30 Apr 2025 06:40AM UTC coverage: 80.835% (+12.5%) from 68.293%
14748358210

push

github

nightconcept
fix: add test

211 of 220 new or added lines in 1 file covered. (95.91%)

1 existing line in 1 file now uncovered.

1607 of 1988 relevant lines covered (80.84%)

2.3 hits per line

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

95.09
/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
local describe = require("busted").describe
1✔
14
local it = require("busted").it
1✔
15
local assert = require("luassert")
1✔
16
local stub = require("luassert.stub")
1✔
17

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

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

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

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

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

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

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

118
    assert.is_true(success)
1✔
119
    assert.are.same(err, nil)
1✔
120
    assert.is_true(get_save_called())
1✔
121
    -- Expect 3 prints: Added, Downloaded, Updated lockfile (hash warning skipped)
122
    assert.are.same(#printed, 3)
1✔
123
    print_stub:revert()
1✔
124
  end)
125

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

133
    deps.ensure_lib_dir = function()
134
      ensure_lib_dir_called = true
1✔
135
    end
136

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

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

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

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

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

166
    deps.ensure_lib_dir = function()
167
      ensure_lib_dir_called = true
1✔
168
    end
169

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

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

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

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

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

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

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

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

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

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

243
    assert.are.same(get_saved_manifest().dependencies[dep_name], dep_source)
1✔
244
    -- Verify the downloader was called with the RAW url, not the blob url
245
    local expected_raw_url = "https://raw.githubusercontent.com/owner/repo/abcdef1234567890/bar.lua"
1✔
246
    assert.are.equal(downloader_args.url, expected_raw_url) -- Corrected assertion
1✔
247
    assert.are.equal(downloader_args.out_path, "custom/bar.lua")
1✔
248
  end)
249

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

266
    local dep_url = "https://github.com/owner/repo/blob/abcdef1234567890/baz.lua"
1✔
267
    local _, _ = add_mod.add_dependency(nil, dep_url, nil, deps)
1✔
268

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

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

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

317
  it("prints error and returns if dep_name cannot be inferred from bad URL", function()
2✔
318
    local manifest = { dependencies = {} }
1✔
319
    local deps, _, get_save_called = make_test_deps(manifest)
1✔
320

321
    local success, err = add_mod.add_dependency(nil, "https://example.com/", nil, deps)
1✔
322
    assert.is_false(success)
1✔
323
    -- Check the error message directly
324
    assert.are.same(err, "Could not infer dependency name from URL")
1✔
325
    -- Use the getter from the closure
326
    assert.is_false(get_save_called())
1✔
327
  end)
328

329
  it("prints error and returns if save_manifest fails", function()
2✔
330
    local manifest = { dependencies = {} }
1✔
331
    local deps = make_test_deps(manifest, function()
2✔
332
      return false, "save failed"
1✔
333
    end)
334

335
    local printed = {}
1✔
336
    stub(_G, "print", function(msg)
2✔
337
      table.insert(printed, tostring(msg))
1✔
338
    end)
339
    assert.has_no.errors(function()
2✔
340
      add_mod.add_dependency("foo", "url", nil, deps)
1✔
341
    end)
342
    assert.is_true(table.concat(printed, "\n"):match("save failed") ~= nil)
1✔
343
  end)
344

345
  it("prints error if downloader fails", function()
2✔
346
    local manifest = { dependencies = {} }
1✔
347
    local deps = make_test_deps(manifest, nil, function()
2✔
348
      return false, "download failed"
1✔
349
    end)
350

351
    local printed = {}
1✔
352
    stub(_G, "print", function(msg)
2✔
353
      table.insert(printed, tostring(msg))
2✔
354
    end)
355
    assert.has_no.errors(function()
2✔
356
      add_mod.add_dependency("foo", "url", nil, deps)
1✔
357
    end)
358
    local output = table.concat(printed, "\n")
1✔
359
    assert.is_true(output:match("Failed to download") ~= nil)
1✔
360
    assert.is_true(output:match("download failed") ~= nil)
1✔
361
  end)
362

363
  it("does not fail when no dependency is given", function()
2✔
364
    local manifest = make_fake_manifest()
1✔
365
    local deps = make_test_deps(manifest, function()
2✔
NEW
366
      error("Should not be called")
×
367
    end)
368

369
    assert.has_no.errors(function()
2✔
370
      add_mod.add_dependency(nil, nil, nil, deps)
1✔
371
    end)
372
  end)
373
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