git.iko.soy/typeable/remark-validate-links
on 9.1.0 help sign in
1051 lines 42 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 ' 71:41-71:56 warning Link to unknown heading: `readme` missing-heading remark-validate-links',
667 '',
668 '⚠ 15 warnings'
669 ].join('\n'),
670 'should report'
671 )
672 },
673 function(err) {
674 clean()
675 st.error(err)
676 }
677 )
679 function clean() {
680 fs.renameSync('../../.git.bak', '../../.git')
681 }
682 })
684 t.test('should work when finding non-hosted Git remotes', function(st) {
685 st.plan(1)
687 execa(bin, [
688 '--no-config',
689 '--no-ignore',
690 '--use',
691 '../..=repository:"ssh://git@domain.com/user/project.git"',
692 '--use',
693 '../sort',
694 'small.md'
695 ]).then(function(result) {
696 st.equal(
697 strip(result.stderr),
698 [
699 'small.md',
700 ' 5:13-5:27 warning Link to unknown heading: `world` missing-heading remark-validate-links',
701 '',
702 '⚠ 1 warning'
703 ].join('\n'),
704 'should report'
705 )
706 }, st.error)
707 })
709 t.test('should support a GitLab shortcode', function(st) {
710 st.plan(1)
712 execa(bin, [
713 '--no-config',
714 '--no-ignore',
715 '--use',
716 '../..=repository:"gitlab:wooorm/test"',
717 '--use',
718 '../sort',
719 'gitlab.md'
720 ]).then(function(result) {
721 st.equal(
722 strip(result.stderr),
723 [
724 'gitlab.md',
725 ' 5:37-5:51 warning Link to unknown heading: `world` missing-heading remark-validate-links',
726 ' 19:34-19:102 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
727 ' 21:12-21:81 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
728 ' 23:10-23:37 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
729 ' 25:10-25:35 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
730 ' 37:10-37:41 warning Link to unknown heading in `examples/gitlab.md`: `world` missing-heading-in-file remark-validate-links',
731 ' 39:10-39:39 warning Link to unknown heading in `examples/gitlab.md`: `world` missing-heading-in-file remark-validate-links',
732 ' 41:10-41:82 warning Link to unknown heading in `examples/gitlab.md`: `world` missing-heading-in-file remark-validate-links',
733 ' 43:10-43:83 warning Link to unknown heading in `examples/gitlab.md`: `world` missing-heading-in-file remark-validate-links',
734 ' 45:10-45:40 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
735 ' 45:10-45:40 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
736 ' 47:10-47:38 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
737 ' 47:10-47:38 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
738 ' 49:10-49:81 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
739 ' 49:10-49:81 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
740 ' 51:10-51:82 warning Link to unknown file: `examples/world.md`. Did you mean `examples/gitlab.md` missing-file remark-validate-links',
741 ' 51:10-51:82 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
742 '',
743 '⚠ 17 warnings'
744 ].join('\n'),
745 'should report'
746 )
747 }, st.error)
748 })
750 t.test('should support a Bitbucket shortcode', function(st) {
751 st.plan(1)
753 execa(bin, [
754 '--no-config',
755 '--no-ignore',
756 '--use',
757 '../..=repository:"bitbucket:wooorm/test"',
758 '--use',
759 '../sort',
760 'bitbucket.md'
761 ]).then(function(result) {
762 st.equal(
763 strip(result.stderr),
764 [
765 'bitbucket.md',
766 ' 5:37-5:67 warning Link to unknown heading: `world` missing-heading remark-validate-links',
767 ' 21:34-21:104 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
768 ' 23:12-23:83 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
769 ' 25:10-25:37 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
770 ' 27:10-27:35 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
771 ' 39:10-39:60 warning Link to unknown heading in `examples/bitbucket.md`: `world` missing-heading-in-file remark-validate-links',
772 ' 41:10-41:58 warning Link to unknown heading in `examples/bitbucket.md`: `world` missing-heading-in-file remark-validate-links',
773 ' 43:10-43:103 warning Link to unknown heading in `examples/bitbucket.md`: `world` missing-heading-in-file remark-validate-links',
774 ' 45:10-45:104 warning Link to unknown heading in `examples/bitbucket.md`: `world` missing-heading-in-file remark-validate-links',
775 ' 47:10-47:56 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
776 ' 47:10-47:56 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
777 ' 49:10-49:54 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
778 ' 49:10-49:54 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
779 ' 51:10-51:99 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
780 ' 51:10-51:99 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
781 ' 53:10-53:100 warning Link to unknown file: `examples/world.md` missing-file remark-validate-links',
782 ' 53:10-53:100 warning Link to unknown heading in `examples/world.md`: `hello` missing-heading-in-file remark-validate-links',
783 '',
784 '⚠ 17 warnings'
785 ].join('\n'),
786 'should report'
787 )
788 }, st.error)
789 })
791 t.test('should suggest similar links', function(st) {
792 st.plan(1)
794 execa(bin, [
795 '--no-config',
796 '--no-ignore',
797 '--use',
798 '../..',
799 '--use',
800 '../sort',
801 'suggestions.md'
802 ]).then(function(result) {
803 st.equal(
804 strip(result.stderr),
805 [
806 'suggestions.md',
807 ' 3:22-3:37 warning Link to unknown heading: `helloo`. Did you mean `hello` missing-heading remark-validate-links',
808 ' 7:17-7:39 warning Link to unknown heading in `github.md`: `fiiiles`. Did you mean `files` missing-heading-in-file remark-validate-links',
809 '',
810 '⚠ 2 warnings'
811 ].join('\n'),
812 'should report'
813 )
814 }, st.error)
815 })
817 t.test('should recognise links to particular lines', function(st) {
818 st.plan(1)
820 execa(bin, [
821 '--no-config',
822 '--no-ignore',
823 '--use',
824 '../..=repository:"wooorm/test"',
825 '--use',
826 '../sort',
827 'line-links.md'
828 ]).then(function(result) {
829 st.equal(
830 strip(result.stderr),
831 [
832 'line-links.md',
833 ' 5:9-5:61 warning Link to unknown file: `examples/missing.js` missing-file remark-validate-links',
834 ' 9:1-9:71 warning Link to unknown file: `examples/missing.js` missing-file remark-validate-links',
835 '',
836 '⚠ 2 warnings'
837 ].join('\n'),
838 'should report'
839 )
840 }, st.error)
841 })
843 t.test('should recognise links with encoded URLs', function(st) {
844 st.plan(1)
846 execa(bin, [
847 '--no-config',
848 '--no-ignore',
849 '--use',
850 '../..=repository:"wooorm/test"',
851 '--use',
852 '../sort',
853 'weird-characters.md'
854 ]).then(function(result) {
855 st.equal(
856 strip(result.stderr),
857 [
858 'weird-characters.md',
859 ' 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',
860 ' 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',
861 ' 15:17-15:114 warning Link to unknown heading in `examples/weird#characters.md`: `world` missing-heading-in-file remark-validate-links',
862 ' 17:17-17:120 warning Link to unknown heading in `examples/weird#character/readme.md`: `world` missing-heading-in-file remark-validate-links',
863 '',
864 '⚠ 4 warnings'
865 ].join('\n'),
866 'should report'
867 )
868 }, st.error)
869 })
871 t.test('should check images', function(st) {
872 st.plan(1)
874 execa(bin, [
875 '--no-config',
876 '--no-ignore',
877 '--use',
878 '../..=repository:"wooorm/test"',
879 '--use',
880 '../sort',
881 'images.md'
882 ]).then(function(result) {
883 st.equal(
884 strip(result.stderr),
885 [
886 'images.md',
887 ' 19:10-19:50 warning Link to unknown file: `examples/missing.jpg`. Did you mean `examples/image.jpg` missing-file remark-validate-links',
888 ' 21:12-21:42 warning Link to unknown file: `examples/missing.jpg`. Did you mean `examples/image.jpg` missing-file remark-validate-links',
889 ' 23:10-23:91 warning Link to unknown file: `examples/missing.jpg`. Did you mean `examples/image.jpg` missing-file remark-validate-links',
890 ' 35:1-35:38 warning Link to unknown file: `examples/missing.jpg`. Did you mean `examples/image.jpg` missing-file remark-validate-links',
891 ' 37:1-37:79 warning Link to unknown file: `examples/missing.jpg`. Did you mean `examples/image.jpg` missing-file remark-validate-links',
892 '',
893 '⚠ 5 warnings'
894 ].join('\n'),
895 'should report'
896 )
897 }, st.error)
898 })
900 t.test('should support query parameters', function(st) {
901 st.plan(1)
903 execa(bin, [
904 '--no-config',
905 '--no-ignore',
906 '--use',
907 '../..=repository:"wooorm/test"',
908 '--use',
909 '../sort',
910 'query-params.md'
911 ]).then(
912 function(result) {
913 st.equal(
914 strip(result.stderr),
915 [
916 'query-params.md',
917 ' 9:33-9:55 warning Link to unknown heading: `query-params?`. Did you mean `query-params` missing-heading remark-validate-links',
918 '',
919 '⚠ 1 warning'
920 ].join('\n'),
921 'should report'
922 )
923 },
924 function(err) {
925 st.error(err, 'should not fail')
926 }
927 )
928 })
930 t.test('should support case insensitive headings', function(st) {
931 st.plan(1)
933 execa(bin, [
934 '--no-config',
935 '--no-ignore',
936 '--use',
937 '../..',
938 '--use',
939 '../sort',
940 'case-insensitive-headings.md'
941 ]).then(
942 function(result) {
943 st.equal(
944 strip(result.stderr),
945 [
946 'case-insensitive-headings.md',
947 ' 5:13-5:27 warning Link to unknown heading: `world` missing-heading remark-validate-links',
948 ' 9:16-9:48 warning Link to unknown heading in `examples/github.md`: `world` missing-heading-in-file remark-validate-links',
949 '',
950 '⚠ 2 warnings'
951 ].join('\n'),
952 'should report'
953 )
954 },
955 function(err) {
956 st.error(err, 'should not fail')
957 }
958 )
959 })
961 t.test('should ignore external links', function(st) {
962 st.plan(1)
964 execa(bin, [
965 '--no-config',
966 '--no-ignore',
967 '--use',
968 '../..=repository:"wooorm/test"',
969 '--use',
970 '../sort',
971 'external.md'
972 ]).then(function(result) {
973 st.equal(
974 strip(result.stderr),
975 'external.md: no issues found',
976 'should report'
977 )
978 }, st.error)
979 })
981 t.test('should ignore external links (without repo)', function(st) {
982 st.plan(1)
984 execa(bin, [
985 '--no-config',
986 '--no-ignore',
987 '--use',
988 '../..=repository:false',
989 '--use',
990 '../sort',
991 'external.md'
992 ]).then(function(result) {
993 st.equal(
994 strip(result.stderr),
995 'external.md: no issues found',
996 'should report'
997 )
998 }, st.error)
999 })
1001 t.test('should support self-hosted Git solutions', function(st) {
1002 st.plan(1)
1004 Promise.resolve()
1005 .then(function() {
1006 return execa('git', ['init'])
1007 })
1008 .then(function() {
1009 return execa('git', [
1010 'remote',
1011 'add',
1012 'origin',
1013 'git@gitlab.acme.company:acme/project.git'
1014 ])
1015 })
1016 .then(function() {
1017 return execa(bin, [
1018 '--no-config',
1019 '--no-ignore',
1020 '--use',
1021 '../..=urlConfig:{hostname:"gitlab.acme.com",prefix:"/acme/project/blob/",headingPrefix:"#",lines:true}',
1022 'self-hosted.md'
1023 ])
1024 })
1025 .then(
1026 function(result) {
1027 clean()
1028 st.equal(
1029 strip(result.stderr),
1031 'self-hosted.md',
1032 ' 5:1-5:82 warning Link to unknown heading: `world` missing-heading remark-validate-links',
1033 '',
1034 '⚠ 1 warning'
1035 ].join('\n'),
1036 'should report'
1038 },
1039 function(err) {
1040 clean()
1041 st.error(err)
1045 function clean() {
1046 rimraf.sync('./.git')
1048 })
1050 t.end()