git.iko.soy/typeable/remark-validate-links
on 9.0.1 help sign in
1050 lines 41 kB history raw
1'use strict'
3var fs = require('fs')
4var path = require('path')
5var test = require('tape')
6var execa = require('execa')
7var vfile = require('to-vfile')
8var remark = require('remark')
9var strip = require('strip-ansi')
10var rimraf = require('rimraf')
11var sort = require('./sort')
12var links = require('..')
14process.chdir(path.resolve(process.cwd(), 'test', 'fixtures'))
16test.onFinish(function() {
17 process.chdir(path.resolve(process.cwd(), '..', '..'))
18})
20var bin = path.join('..', '..', 'node_modules', '.bin', 'remark')
22test('remark-validate-links', function(t) {
23 t.test('should work on the API', function(st) {
24 st.plan(1)
26 remark()
27 .use(links)
28 .use(sort)
29 .process(vfile.readSync('github.md'), function(err, file) {
30 st.deepEqual(
31 [err].concat(file.messages.map(String)),
32 [
33 null,
34 'github.md:5:37-5:51: Link to unknown heading: `world`',
35 'github.md:27:10-27:37: Link to unknown file: `examples/world.md`',
36 'github.md:29:10-29:35: Link to unknown file: `examples/world.md`',
37 'github.md:49:10-49:40: Link to unknown file: `examples/world.md`',
38 'github.md:51:10-51:38: Link to unknown file: `examples/world.md`'
39 ],
40 'should report messages'
41 )
42 })
43 })
45 t.test('should ignore invalid repositories', function(st) {
46 st.plan(1)
48 execa(bin, [
49 '--no-config',
50 '--no-ignore',
51 '--use',
52 '../..=repository:"invalid:shortcode"',
53 '--use',
54 '../sort',
55 'small.md'
56 ]).then(
57 function(result) {
58 st.equal(
59 strip(result.stderr),
60 [
61 'small.md',
62 ' 5:13-5:27 warning Link to unknown heading: `world` missing-heading remark-validate-links',
63 '',
64 '⚠ 1 warning'
65 ].join('\n'),
66 'should work'
67 )
68 },
69 function(err) {
70 st.error(err)
71 }
72 )
73 })
75 t.test('should throw on Gist repositories', function(st) {
76 st.plan(1)
78 execa(bin, [
79 '--no-config',
80 '--no-ignore',
81 '--use',
82 '../..=repository:"gist:wooorm/8504606"',
83 '--use',
84 '../sort',
85 'small.md'
86 ]).then(
87 function(result) {
88 st.equal(
89 strip(result.stderr),
90 [
91 'small.md',
92 ' 5:13-5:27 warning Link to unknown heading: `world` missing-heading remark-validate-links',
93 '',
94 '⚠ 1 warning'
95 ].join('\n'),
96 'should work'
97 )
98 },
99 function(err) {
100 st.error(err, 'should not fail')
101 }
102 )
103 })
105 t.test('should ignore unfound files (#1)', function(st) {
106 st.plan(1)
108 execa(bin, [
109 '--no-config',
110 '--no-ignore',
111 '--use',
112 '../..',
113 '--use',
114 '../sort',
115 'FOOOO'
116 ]).then(
117 function() {
118 st.fail('should not be successful')
119 },
120 function(err) {
121 st.equal(
122 strip(err.stderr),
123 [
124 'FOOOO',
125 ' 1:1 error No such file or directory',
126 '',
127 '✖ 1 error'
128 ].join('\n'),
129 'should report an error'
130 )
131 }
132 )
133 })
135 t.test('should ignore unfound files (#2)', function(st) {
136 st.plan(1)
138 execa(bin, [
139 '--no-config',
140 '--no-ignore',
141 '--use',
142 '../..',
143 '--use',
144 '../sort',
145 'definitions.md',
146 'FOOOO'
147 ]).then(
148 function() {
149 st.fail('should not be successful')
150 },
151 function(err) {
152 st.equal(
153 strip(err.stderr),
154 [
155 'FOOOO',
156 ' 1:1 error No such file or directory',
157 '',
158 'definitions.md',
159 ' 10:1-10:18 warning Link to unknown heading: `world` missing-heading remark-validate-links',
160 '',
161 '2 messages (✖ 1 error, ⚠ 1 warning)'
162 ].join('\n'),
163 'should report an error'
164 )
165 }
166 )
167 })
169 t.test('should work if there are no links', function(st) {
170 st.plan(1)
172 execa(bin, [
173 '--no-config',
174 '--no-ignore',
175 '--use',
176 '../..',
177 '--use',
178 '../sort',
179 'empty.md'
180 ]).then(function(result) {
181 st.equal(
182 strip(result.stderr),
183 'empty.md: no issues found',
184 'should report'
185 )
186 }, st.error)
187 })
189 t.test('should work with stdin', function(st) {
190 st.plan(1)
192 var subprocess = execa(bin, [
193 '--no-config',
194 '--no-ignore',
195 '--use',
196 '../..',
197 '--use',
198 '../sort'
199 ])
201 fs.createReadStream('github.md').pipe(subprocess.stdin)
203 subprocess.then(function(result) {
204 st.equal(
205 strip(result.stderr),
206 [
207 '<stdin>',
208 ' 5:37-5:51 warning Link to unknown heading: `world` missing-heading remark-validate-links',
209 '',
210 '⚠ 1 warning'
211 ].join('\n'),
212 'should report an error'
213 )
214 }, st.error)
215 })
217 t.test('should work when not all files are given', function(st) {
218 st.plan(1)
220 execa(bin, [
221 '--no-config',
222 '--no-ignore',
223 '--use',
224 '../..',
225 '--use',
226 '../sort',
227 'github.md'
228 ]).then(function(result) {
229 st.equal(
230 strip(result.stderr),
231 [
232 'github.md',
233 ' 5:37-5:51 warning Link to unknown heading: `world` missing-heading remark-validate-links',
234 ' 27:10-27:37 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
235 ' 29:10-29:35 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
236 ' 41:10-41:41 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
237 ' 43:10-43:39 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
238 ' 49:10-49:40 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
239 ' 49:10-49:40 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
240 ' 51:10-51:38 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
241 ' 51:10-51:38 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
242 '',
243 '⚠ 9 warnings'
244 ].join('\n'),
245 'should report'
246 )
247 }, st.error)
248 })
250 t.test('should work when all files are given', function(st) {
251 st.plan(1)
253 execa(bin, [
254 '--no-config',
255 '--no-ignore',
256 '--use',
257 '../..',
258 '--use',
259 '../sort',
260 'github.md',
261 'examples/github.md'
262 ]).then(function(result) {
263 st.equal(
264 strip(result.stderr),
265 [
266 'examples/github.md',
267 ' 5:37-5:51 warning Link to unknown heading: `world` missing-heading remark-validate-links',
268 ' 19:10-19:29 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
269 ' 29:10-29:33 warning Link to unknown heading in `../github.md`: `world` missing-heading-in-file remark-validate-links',
270 ' 35:10-35:32 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
271 ' 35:10-35:32 warning Link to unknown heading in `../world.md`: `hello` missing-heading-in-file remark-validate-links',
272 '',
273 'github.md',
274 ' 5:37-5:51 warning Link to unknown heading: `world` missing-heading remark-validate-links',
275 ' 27:10-27:37 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
276 ' 29:10-29:35 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
277 ' 41:10-41:41 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
278 ' 43:10-43:39 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
279 ' 49:10-49:40 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
280 ' 49:10-49:40 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
281 ' 51:10-51:38 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
282 ' 51:10-51:38 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
283 '',
284 '⚠ 14 warnings'
285 ].join('\n'),
286 'should report'
287 )
288 }, st.error)
289 })
291 t.test('should work with definitions', function(st) {
292 st.plan(1)
294 execa(bin, [
295 '--no-config',
296 '--no-ignore',
297 '--use',
298 '../..',
299 '--use',
300 '../sort',
301 'definitions.md'
302 ]).then(function(result) {
303 st.equal(
304 strip(result.stderr),
305 [
306 'definitions.md',
307 ' 10:1-10:18 warning Link to unknown heading: `world` missing-heading remark-validate-links',
308 '',
309 '⚠ 1 warning'
310 ].join('\n'),
311 'should report'
312 )
313 }, st.error)
314 })
316 t.test('should work on GitHub URLs when given a repo', function(st) {
317 st.plan(1)
319 execa(bin, [
320 '--no-config',
321 '--no-ignore',
322 '--use',
323 '../..=repository:"wooorm/test"',
324 '--use',
325 '../sort',
326 'github.md',
327 'examples/github.md'
328 ]).then(function(result) {
329 st.equal(
330 strip(result.stderr),
331 [
332 'examples/github.md',
333 ' 5:37-5:51 warning Link to unknown heading: `world` missing-heading remark-validate-links',
334 ' 15:34-15:93 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
335 ' 17:12-17:72 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
336 ' 19:10-19:29 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
337 ' 29:10-29:33 warning Link to unknown heading in `../github.md`: `world` missing-heading-in-file remark-validate-links',
338 ' 31:10-31:73 warning Link to unknown heading in `../github.md`: `world` missing-heading-in-file remark-validate-links',
339 ' 33:10-33:74 warning Link to unknown heading in `../github.md`: `world` missing-heading-in-file remark-validate-links',
340 ' 35:10-35:32 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
341 ' 35:10-35:32 warning Link to unknown heading in `../world.md`: `hello` missing-heading-in-file remark-validate-links',
342 ' 37:10-37:72 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
343 ' 37:10-37:72 warning Link to unknown heading in `../world.md`: `hello` missing-heading-in-file remark-validate-links',
344 ' 39:10-39:73 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
345 ' 39:10-39:73 warning Link to unknown heading in `../world.md`: `hello` missing-heading-in-file remark-validate-links',
346 '',
347 'github.md',
348 ' 5:37-5:51 warning Link to unknown heading: `world` missing-heading remark-validate-links',
349 ' 21:34-21:102 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
350 ' 23:34-23:84 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
351 ' 25:12-25:81 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
352 ' 27:10-27:37 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
353 ' 29:10-29:35 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
354 ' 41:10-41:41 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
355 ' 43:10-43:39 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
356 ' 45:10-45:82 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
357 ' 47:10-47:83 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
358 ' 49:10-49:40 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
359 ' 49:10-49:40 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
360 ' 51:10-51:38 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
361 ' 51:10-51:38 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
362 ' 53:10-53:81 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
363 ' 53:10-53:81 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
364 ' 55:10-55:82 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
365 ' 55:10-55:82 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
366 '',
367 '⚠ 31 warnings'
368 ].join('\n'),
369 'should report'
370 )
371 }, st.error)
372 })
374 t.test('should work when with Git directory', function(st) {
375 st.plan(1)
377 Promise.resolve()
378 .then(function() {
379 return execa('git', ['init'])
380 })
381 .then(function() {
382 return execa('git', [
383 'remote',
384 'add',
385 'origin',
386 'git@github.com:wooorm/test.git'
387 ])
388 })
389 .then(function() {
390 return execa(bin, [
391 '--no-config',
392 '--no-ignore',
393 '--use',
394 '../..',
395 '--use',
396 '../sort',
397 'github.md',
398 'examples/github.md'
399 ])
400 })
401 .then(
402 function(result) {
403 clean()
404 st.equal(
405 strip(result.stderr),
406 [
407 'examples/github.md',
408 ' 5:37-5:51 warning Link to unknown heading: `world` missing-heading remark-validate-links',
409 ' 15:34-15:93 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
410 ' 17:12-17:72 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
411 ' 19:10-19:29 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
412 ' 29:10-29:33 warning Link to unknown heading in `../github.md`: `world` missing-heading-in-file remark-validate-links',
413 ' 31:10-31:73 warning Link to unknown heading in `../github.md`: `world` missing-heading-in-file remark-validate-links',
414 ' 33:10-33:74 warning Link to unknown heading in `../github.md`: `world` missing-heading-in-file remark-validate-links',
415 ' 35:10-35:32 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
416 ' 35:10-35:32 warning Link to unknown heading in `../world.md`: `hello` missing-heading-in-file remark-validate-links',
417 ' 37:10-37:72 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
418 ' 37:10-37:72 warning Link to unknown heading in `../world.md`: `hello` missing-heading-in-file remark-validate-links',
419 ' 39:10-39:73 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
420 ' 39:10-39:73 warning Link to unknown heading in `../world.md`: `hello` missing-heading-in-file remark-validate-links',
421 '',
422 'github.md',
423 ' 5:37-5:51 warning Link to unknown heading: `world` missing-heading remark-validate-links',
424 ' 21:34-21:102 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
425 ' 23:34-23:84 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
426 ' 25:12-25:81 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
427 ' 27:10-27:37 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
428 ' 29:10-29:35 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
429 ' 41:10-41:41 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
430 ' 43:10-43:39 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
431 ' 45:10-45:82 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
432 ' 47:10-47:83 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
433 ' 49:10-49:40 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
434 ' 49:10-49:40 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
435 ' 51:10-51:38 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
436 ' 51:10-51:38 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
437 ' 53:10-53:81 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
438 ' 53:10-53:81 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
439 ' 55:10-55:82 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
440 ' 55:10-55:82 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
441 '',
442 '⚠ 31 warnings'
443 ].join('\n'),
444 'should report'
445 )
446 },
447 function(err) {
448 clean()
449 st.error(err)
450 }
451 )
453 function clean() {
454 rimraf.sync('./.git')
455 }
456 })
458 t.test('should fail w/o Git repository', function(st) {
459 st.plan(1)
461 fs.renameSync('../../.git', '../../.git.bak')
463 execa(bin, [
464 '--no-config',
465 '--no-ignore',
466 '--use',
467 '../..',
468 '--use',
469 '../sort',
470 'github.md'
471 ]).then(
472 function() {
473 clean()
474 st.fail('should not work')
475 },
476 function(err) {
477 clean()
478 st.ok(/not a git repository/i.test(err.stderr), 'should fail')
479 }
480 )
482 function clean() {
483 fs.renameSync('../../.git.bak', '../../.git')
484 }
485 })
487 t.test('should fail w/o Git repository w/o remote', function(st) {
488 st.plan(1)
490 Promise.resolve()
491 .then(function() {
492 return execa('git', ['init'])
493 })
494 .then(function() {
495 return execa(bin, [
496 '--no-config',
497 '--no-ignore',
498 '--use',
499 '../..',
500 'github.md'
501 ])
502 })
503 .then(
504 function() {
505 clean()
506 st.fail('should not work')
507 },
508 function(err) {
509 clean()
510 st.ok(/Could not find remote origin/.test(err.stderr), 'should fail')
511 }
512 )
514 function clean() {
515 rimraf.sync('./.git')
516 }
517 })
519 t.test('should work w/o Git repository w/ repo', function(st) {
520 st.plan(1)
522 fs.renameSync('../../.git', '../../.git.bak')
524 execa(bin, [
525 '--no-config',
526 '--no-ignore',
527 '--use',
528 '../..=repository:"wooorm/test"',
529 '--use',
530 '../sort',
531 'small.md'
532 ]).then(
533 function(result) {
534 clean()
535 st.equal(
536 strip(result.stderr),
537 [
538 'small.md',
539 ' 5:13-5:27 warning Link to unknown heading: `world` missing-heading remark-validate-links',
540 '',
541 '⚠ 1 warning'
542 ].join('\n'),
543 'should work'
544 )
545 },
546 function(err) {
547 clean()
548 st.error(err, 'shoult not fail')
549 }
550 )
552 function clean() {
553 fs.renameSync('../../.git.bak', '../../.git')
554 }
555 })
557 t.test('should work w/o Git repository w/ remote', function(st) {
558 st.plan(1)
560 fs.renameSync('../../.git', '../../.git.bak')
562 execa(bin, [
563 '--no-config',
564 '--no-ignore',
565 '--use',
566 '../..=repository:{remote:"wooorm/test"}',
567 'small.md'
568 ]).then(
569 function(result) {
570 clean()
571 st.equal(
572 strip(result.stderr),
573 [
574 'small.md',
575 ' 5:13-5:27 warning Link to unknown heading: `world` missing-heading remark-validate-links',
576 '',
577 '⚠ 1 warning'
578 ].join('\n'),
579 'should work'
580 )
581 },
582 function(err) {
583 clean()
584 st.error(err, 'shoult not fail')
585 }
586 )
588 function clean() {
589 fs.renameSync('../../.git.bak', '../../.git')
590 }
591 })
593 t.test('should work w/o Git repository w/ remote and root', function(st) {
594 st.plan(1)
596 fs.renameSync('../../.git', '../../.git.bak')
598 execa(bin, [
599 '--no-config',
600 '--no-ignore',
601 '--use',
602 '../..=repository:"wooorm/test",root:"../"',
603 'small.md'
604 ]).then(
605 function(result) {
606 clean()
607 st.equal(
608 strip(result.stderr),
609 [
610 'small.md',
611 ' 5:13-5:27 warning Link to unknown heading: `world` missing-heading remark-validate-links',
612 '',
613 '⚠ 1 warning'
614 ].join('\n'),
615 'should work'
616 )
617 },
618 function(err) {
619 clean()
620 st.error(err, 'shoult not fail')
621 }
622 )
624 function clean() {
625 fs.renameSync('../../.git.bak', '../../.git')
626 }
627 })
629 t.test('should work with `repository:false`', function(st) {
630 st.plan(1)
632 fs.renameSync('../../.git', '../../.git.bak')
634 execa(bin, [
635 '--no-config',
636 '--no-ignore',
637 '--use',
638 '../..=repository:false',
639 '--use',
640 '../sort',
641 'github.md',
642 'examples/github.md'
643 ]).then(
644 function(result) {
645 clean()
646 st.equal(
647 strip(result.stderr),
648 [
649 'examples/github.md',
650 ' 5:37-5:51 warning Link to unknown heading: `world` missing-heading remark-validate-links',
651 ' 19:10-19:29 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
652 ' 29:10-29:33 warning Link to unknown heading in `../github.md`: `world` missing-heading-in-file remark-validate-links',
653 ' 35:10-35:32 warning Link to unknown file: `../world.md` missing-file remark-validate-links',
654 ' 35:10-35:32 warning Link to unknown heading in `../world.md`: `hello` missing-heading-in-file remark-validate-links',
655 '',
656 'github.md',
657 ' 5:37-5:51 warning Link to unknown heading: `world` missing-heading remark-validate-links',
658 ' 27:10-27:37 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
659 ' 29:10-29:35 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
660 ' 41:10-41:41 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
661 ' 43:10-43:39 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
662 ' 49:10-49:40 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
663 ' 49:10-49:40 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
664 ' 51:10-51:38 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
665 ' 51:10-51:38 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
666 '',
667 '⚠ 14 warnings'
668 ].join('\n'),
669 'should report'
670 )
671 },
672 function(err) {
673 clean()
674 st.error(err)
675 }
676 )
678 function clean() {
679 fs.renameSync('../../.git.bak', '../../.git')
680 }
681 })
683 t.test('should work when finding non-hosted Git remotes', function(st) {
684 st.plan(1)
686 execa(bin, [
687 '--no-config',
688 '--no-ignore',
689 '--use',
690 '../..=repository:"ssh://git@domain.com/user/project.git"',
691 '--use',
692 '../sort',
693 'small.md'
694 ]).then(function(result) {
695 st.equal(
696 strip(result.stderr),
697 [
698 'small.md',
699 ' 5:13-5:27 warning Link to unknown heading: `world` missing-heading remark-validate-links',
700 '',
701 '⚠ 1 warning'
702 ].join('\n'),
703 'should report'
704 )
705 }, st.error)
706 })
708 t.test('should support a GitLab shortcode', function(st) {
709 st.plan(1)
711 execa(bin, [
712 '--no-config',
713 '--no-ignore',
714 '--use',
715 '../..=repository:"gitlab:wooorm/test"',
716 '--use',
717 '../sort',
718 'gitlab.md'
719 ]).then(function(result) {
720 st.equal(
721 strip(result.stderr),
722 [
723 'gitlab.md',
724 ' 5:37-5:51 warning Link to unknown heading: `world` missing-heading remark-validate-links',
725 ' 19:34-19:102 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
726 ' 21:12-21:81 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
727 ' 23:10-23:37 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
728 ' 25:10-25:35 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
729 ' 37:10-37:41 warning Link to unknown heading in `examples/gitlab.md`: `world` missing-heading-in-file remark-validate-links',
730 ' 39:10-39:39 warning Link to unknown heading in `examples/gitlab.md`: `world` missing-heading-in-file remark-validate-links',
731 ' 41:10-41:82 warning Link to unknown heading in `examples/gitlab.md`: `world` missing-heading-in-file remark-validate-links',
732 ' 43:10-43:83 warning Link to unknown heading in `examples/gitlab.md`: `world` missing-heading-in-file remark-validate-links',
733 ' 45:10-45:40 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
734 ' 45:10-45:40 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
735 ' 47:10-47:38 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
736 ' 47:10-47:38 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
737 ' 49:10-49:81 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
738 ' 49:10-49:81 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
739 ' 51:10-51:82 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
740 ' 51:10-51:82 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
741 '',
742 '⚠ 17 warnings'
743 ].join('\n'),
744 'should report'
745 )
746 }, st.error)
747 })
749 t.test('should support a Bitbucket shortcode', function(st) {
750 st.plan(1)
752 execa(bin, [
753 '--no-config',
754 '--no-ignore',
755 '--use',
756 '../..=repository:"bitbucket:wooorm/test"',
757 '--use',
758 '../sort',
759 'bitbucket.md'
760 ]).then(function(result) {
761 st.equal(
762 strip(result.stderr),
763 [
764 'bitbucket.md',
765 ' 5:37-5:67 warning Link to unknown heading: `world` missing-heading remark-validate-links',
766 ' 21:34-21:104 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
767 ' 23:12-23:83 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
768 ' 25:10-25:37 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
769 ' 27:10-27:35 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
770 ' 39:10-39:60 warning Link to unknown heading in `examples/bitbucket.md`: `world` missing-heading-in-file remark-validate-links',
771 ' 41:10-41:58 warning Link to unknown heading in `examples/bitbucket.md`: `world` missing-heading-in-file remark-validate-links',
772 ' 43:10-43:103 warning Link to unknown heading in `examples/bitbucket.md`: `world` missing-heading-in-file remark-validate-links',
773 ' 45:10-45:104 warning Link to unknown heading in `examples/bitbucket.md`: `world` missing-heading-in-file remark-validate-links',
774 ' 47:10-47:56 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
775 ' 47:10-47:56 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
776 ' 49:10-49:54 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
777 ' 49:10-49:54 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
778 ' 51:10-51:99 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
779 ' 51:10-51:99 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
780 ' 53:10-53:100 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
781 ' 53:10-53:100 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
782 '',
783 '⚠ 17 warnings'
784 ].join('\n'),
785 'should report'
786 )
787 }, st.error)
788 })
790 t.test('should suggest similar links', function(st) {
791 st.plan(1)
793 execa(bin, [
794 '--no-config',
795 '--no-ignore',
796 '--use',
797 '../..',
798 '--use',
799 '../sort',
800 'suggestions.md'
801 ]).then(function(result) {
802 st.equal(
803 strip(result.stderr),
804 [
805 'suggestions.md',
806 ' 3:22-3:37 warning Link to unknown heading: `helloo`. Did you mean `hello` missing-heading remark-validate-links',
807 ' 7:17-7:39 warning Link to unknown heading in `github.md`: `fiiiles`. Did you mean `files` missing-heading-in-file remark-validate-links',
808 '',
809 '⚠ 2 warnings'
810 ].join('\n'),
811 'should report'
812 )
813 }, st.error)
814 })
816 t.test('should recognise links to particular lines', function(st) {
817 st.plan(1)
819 execa(bin, [
820 '--no-config',
821 '--no-ignore',
822 '--use',
823 '../..=repository:"wooorm/test"',
824 '--use',
825 '../sort',
826 'line-links.md'
827 ]).then(function(result) {
828 st.equal(
829 strip(result.stderr),
830 [
831 'line-links.md',
832 ' 5:9-5:61 warning Link to unknown file: `examples/missing.js` missing-file remark-validate-links',
833 ' 9:1-9:71 warning Link to unknown file: `examples/missing.js` missing-file remark-validate-links',
834 '',
835 '⚠ 2 warnings'
836 ].join('\n'),
837 'should report'
838 )
839 }, st.error)
840 })
842 t.test('should recognise links with encoded URLs', function(st) {
843 st.plan(1)
845 execa(bin, [
846 '--no-config',
847 '--no-ignore',
848 '--use',
849 '../..=repository:"wooorm/test"',
850 '--use',
851 '../sort',
852 'weird-characters.md'
853 ]).then(function(result) {
854 st.equal(
855 strip(result.stderr),
856 [
857 'weird-characters.md',
858 ' 11:17-11:87 warning Link to unknown file: `examples/missing#characters.md`. Did you mean `examples/weird#characters.md` missing-file remark-validate-links',
859 ' 13:17-13:93 warning Link to unknown file: `examples/missing#character/readme.md`. Did you mean `examples/weird#character/readme.md` missing-file remark-validate-links',
860 ' 15:17-15:114 warning Link to unknown heading in `examples/weird#characters.md`: `world` missing-heading-in-file remark-validate-links',
861 ' 17:17-17:120 warning Link to unknown heading in `examples/weird#character/readme.md`: `world` missing-heading-in-file remark-validate-links',
862 '',
863 '⚠ 4 warnings'
864 ].join('\n'),
865 'should report'
866 )
867 }, st.error)
868 })
870 t.test('should check images', function(st) {
871 st.plan(1)
873 execa(bin, [
874 '--no-config',
875 '--no-ignore',
876 '--use',
877 '../..=repository:"wooorm/test"',
878 '--use',
879 '../sort',
880 'images.md'
881 ]).then(function(result) {
882 st.equal(
883 strip(result.stderr),
884 [
885 'images.md',
886 ' 19:10-19:50 warning Link to unknown file: `examples/missing.jpg`. Did you mean `examples/image.jpg` missing-file remark-validate-links',
887 ' 21:12-21:42 warning Link to unknown file: `examples/missing.jpg`. Did you mean `examples/image.jpg` missing-file remark-validate-links',
888 ' 23:10-23:91 warning Link to unknown file: `examples/missing.jpg`. Did you mean `examples/image.jpg` missing-file remark-validate-links',
889 ' 35:1-35:38 warning Link to unknown file: `examples/missing.jpg`. Did you mean `examples/image.jpg` missing-file remark-validate-links',
890 ' 37:1-37:79 warning Link to unknown file: `examples/missing.jpg`. Did you mean `examples/image.jpg` missing-file remark-validate-links',
891 '',
892 '⚠ 5 warnings'
893 ].join('\n'),
894 'should report'
895 )
896 }, st.error)
897 })
899 t.test('should support query parameters', function(st) {
900 st.plan(1)
902 execa(bin, [
903 '--no-config',
904 '--no-ignore',
905 '--use',
906 '../..=repository:"wooorm/test"',
907 '--use',
908 '../sort',
909 'query-params.md'
910 ]).then(
911 function(result) {
912 st.equal(
913 strip(result.stderr),
914 [
915 'query-params.md',
916 ' 9:33-9:55 warning Link to unknown heading: `query-params?`. Did you mean `query-params` missing-heading remark-validate-links',
917 '',
918 '⚠ 1 warning'
919 ].join('\n'),
920 'should report'
921 )
922 },
923 function(err) {
924 st.error(err, 'should not fail')
925 }
926 )
927 })
929 t.test('should support case insensitive headings', function(st) {
930 st.plan(1)
932 execa(bin, [
933 '--no-config',
934 '--no-ignore',
935 '--use',
936 '../..',
937 '--use',
938 '../sort',
939 'case-insensitive-headings.md'
940 ]).then(
941 function(result) {
942 st.equal(
943 strip(result.stderr),
944 [
945 'case-insensitive-headings.md',
946 ' 5:13-5:27 warning Link to unknown heading: `world` missing-heading remark-validate-links',
947 ' 9:16-9:48 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
948 '',
949 '⚠ 2 warnings'
950 ].join('\n'),
951 'should report'
952 )
953 },
954 function(err) {
955 st.error(err, 'should not fail')
956 }
957 )
958 })
960 t.test('should ignore external links', function(st) {
961 st.plan(1)
963 execa(bin, [
964 '--no-config',
965 '--no-ignore',
966 '--use',
967 '../..=repository:"wooorm/test"',
968 '--use',
969 '../sort',
970 'external.md'
971 ]).then(function(result) {
972 st.equal(
973 strip(result.stderr),
974 'external.md: no issues found',
975 'should report'
976 )
977 }, st.error)
978 })
980 t.test('should ignore external links (without repo)', function(st) {
981 st.plan(1)
983 execa(bin, [
984 '--no-config',
985 '--no-ignore',
986 '--use',
987 '../..=repository:false',
988 '--use',
989 '../sort',
990 'external.md'
991 ]).then(function(result) {
992 st.equal(
993 strip(result.stderr),
994 'external.md: no issues found',
995 'should report'
996 )
997 }, st.error)
998 })
1000 t.test('should support self-hosted Git solutions', function(st) {
1001 st.plan(1)
1003 Promise.resolve()
1004 .then(function() {
1005 return execa('git', ['init'])
1006 })
1007 .then(function() {
1008 return execa('git', [
1009 'remote',
1010 'add',
1011 'origin',
1012 'git@gitlab.acme.company:acme/project.git'
1013 ])
1014 })
1015 .then(function() {
1016 return execa(bin, [
1017 '--no-config',
1018 '--no-ignore',
1019 '--use',
1020 '../..=urlConfig:{hostname:"gitlab.acme.com",prefix:"/acme/project/blob/",headingPrefix:"#",lines:true}',
1021 'self-hosted.md'
1022 ])
1023 })
1024 .then(
1025 function(result) {
1026 clean()
1027 st.equal(
1028 strip(result.stderr),
1030 'self-hosted.md',
1031 ' 5:1-5:82 warning Link to unknown heading: `world` missing-heading remark-validate-links',
1032 '',
1033 '⚠ 1 warning'
1034 ].join('\n'),
1035 'should report'
1037 },
1038 function(err) {
1039 clean()
1040 st.error(err)
1044 function clean() {
1045 rimraf.sync('./.git')
1047 })
1049 t.end()