2023-03-06 12:50:56 +09:00
|
|
|
import {completeRelativeUrls, truncateToBytes} from '../src/readme-helper'
|
2023-03-05 11:13:27 +09:00
|
|
|
|
|
|
|
describe('complete relative urls tests', () => {
|
|
|
|
const GITHUB_SERVER_URL = process.env['GITHUB_SERVER_URL']
|
|
|
|
const GITHUB_REPOSITORY = process.env['GITHUB_REPOSITORY']
|
|
|
|
const GITHUB_REF_NAME = process.env['GITHUB_REF_NAME']
|
|
|
|
|
|
|
|
const README_FILEPATH = './README.md'
|
|
|
|
const EXPECTED_REPOSITORY_URL = `${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}`
|
|
|
|
const EXPECTED_BLOB_URL = `${EXPECTED_REPOSITORY_URL}/blob/${GITHUB_REF_NAME}`
|
|
|
|
const EXPECTED_RAW_URL = `${EXPECTED_REPOSITORY_URL}/raw/${GITHUB_REF_NAME}`
|
|
|
|
|
|
|
|
// known issues
|
|
|
|
test('reference-style links/image sources are not converted', async () => {
|
|
|
|
const content = [
|
|
|
|
'table-of-content][toc]',
|
|
|
|
'',
|
|
|
|
'[toc]: #table-of-content "Table of content"'
|
|
|
|
].join('\n')
|
|
|
|
expect(completeRelativeUrls(content, README_FILEPATH, true, '')).toEqual(
|
|
|
|
content
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('links containing square brackets in the text fragment are not converted', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[[text with square brackets]](README.md)',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
''
|
|
|
|
)
|
|
|
|
).toEqual('[[text with square brackets]](README.md)')
|
|
|
|
})
|
|
|
|
|
|
|
|
test('links containing square brackets in the text fragment are not converted', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls('`[text](README.md)`', README_FILEPATH, true, '')
|
|
|
|
).toEqual(`\`[text](${EXPECTED_BLOB_URL}/README.md)\``)
|
|
|
|
})
|
|
|
|
|
|
|
|
// misc
|
|
|
|
test('do not change content when disabled', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls('[text](README.md)', README_FILEPATH, false, '')
|
|
|
|
).toEqual('[text](README.md)')
|
|
|
|
})
|
|
|
|
|
|
|
|
test('do not change link with mailto protocol', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[text](mailto:mail@example.com)',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
''
|
|
|
|
)
|
|
|
|
).toEqual(`[text](mailto:mail@example.com)`)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('do not change link with ftp protocol', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[text](ftp://example.com)',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
''
|
|
|
|
)
|
|
|
|
).toEqual(`[text](ftp://example.com)`)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('do not change link with http protocol', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[text](http://example.com)',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
''
|
|
|
|
)
|
|
|
|
).toEqual(`[text](http://example.com)`)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('do not change link with https protocol', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[text](https://example.com)',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
''
|
|
|
|
)
|
|
|
|
).toEqual(`[text](https://example.com)`)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('do not change link with protocol-like beginning', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[text](abc://example.com)',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
''
|
|
|
|
)
|
|
|
|
).toEqual(`[text](abc://example.com)`)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('do not change image from absolute source with absolute link', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[](https://example.com/image.svg)',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
'svg'
|
|
|
|
)
|
|
|
|
).toEqual(
|
|
|
|
`[](https://example.com/image.svg)`
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
// anchors
|
|
|
|
test('anchor referencing the current document', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[text](#relative-anchor)',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
''
|
|
|
|
)
|
|
|
|
).toEqual(`[text](${EXPECTED_BLOB_URL}/README.md#relative-anchor)`)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('anchor referencing the current document with a title', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[text](#relative-anchor "the anchor (a title)")',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
''
|
|
|
|
)
|
|
|
|
).toEqual(
|
|
|
|
`[text](${EXPECTED_BLOB_URL}/README.md#relative-anchor "the anchor (a title)")`
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('anchor referencing the current document with a title and unicode', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[text with 🌬](#relative-anchor "the anchor (a title with 🌬)")',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
''
|
|
|
|
)
|
|
|
|
).toEqual(
|
|
|
|
`[text with 🌬](${EXPECTED_BLOB_URL}/README.md#relative-anchor "the anchor (a title with 🌬)")`
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('anchor referencing another document', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[text](OTHER.md#absolute-anchor)',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
''
|
|
|
|
)
|
|
|
|
).toEqual(`[text](${EXPECTED_BLOB_URL}/OTHER.md#absolute-anchor)`)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('anchor referencing another document with a title', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[text](OTHER.md#absolute-anchor "the anchor (a title)")',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
''
|
|
|
|
)
|
|
|
|
).toEqual(
|
|
|
|
`[text](${EXPECTED_BLOB_URL}/OTHER.md#absolute-anchor "the anchor (a title)")`
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('anchor with image referencing the current document', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[](#absolute-anchor "the anchor (a title)")',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
'svg'
|
|
|
|
)
|
|
|
|
).toEqual(
|
|
|
|
`[](${EXPECTED_BLOB_URL}/README.md#absolute-anchor "the anchor (a title)")`
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('anchor with image referencing another document', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[](OTHER.md#absolute-anchor "the anchor (a title)")',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
'svg'
|
|
|
|
)
|
|
|
|
).toEqual(
|
|
|
|
`[](${EXPECTED_BLOB_URL}/OTHER.md#absolute-anchor "the anchor (a title)")`
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
// documents
|
|
|
|
test('text document', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls('[text](document.yaml)', README_FILEPATH, true, '')
|
|
|
|
).toEqual(`[text](${EXPECTED_BLOB_URL}/document.yaml)`)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('pdf document', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls('[text](document.pdf)', README_FILEPATH, true, '')
|
|
|
|
).toEqual(`[text](${EXPECTED_BLOB_URL}/document.pdf)`)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('document with a title', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[text](document.pdf "the document (a title)")',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
''
|
|
|
|
)
|
|
|
|
).toEqual(
|
|
|
|
`[text](${EXPECTED_BLOB_URL}/document.pdf "the document (a title)")`
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('document with a title and unicode', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[text with 🌬](document.pdf "the document (a title with 🌬)")',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
''
|
|
|
|
)
|
|
|
|
).toEqual(
|
|
|
|
`[text with 🌬](${EXPECTED_BLOB_URL}/document.pdf "the document (a title with 🌬)")`
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
// images
|
|
|
|
test('image with supported file extension', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
'svg'
|
|
|
|
)
|
|
|
|
).toEqual(``)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('image with unsupported file extension', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
'jpeg'
|
|
|
|
)
|
|
|
|
).toEqual(``)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('image without alternate text', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls('', README_FILEPATH, true, 'svg')
|
|
|
|
).toEqual(``)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('image with a title', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'")',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
'svg'
|
|
|
|
)
|
|
|
|
).toEqual(`")`)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('image with relative link', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[](image.svg)',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
'svg'
|
|
|
|
)
|
|
|
|
).toEqual(
|
|
|
|
`[](${EXPECTED_BLOB_URL}/image.svg)`
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('image with a title, unicode and relative link', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[")](image.🌬.svg)',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
'svg'
|
|
|
|
)
|
|
|
|
).toEqual(
|
|
|
|
`[")](${EXPECTED_BLOB_URL}/image.🌬.svg)`
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('image from absolute source with relative link', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[](image.svg)',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
'svg'
|
|
|
|
)
|
|
|
|
).toEqual(
|
|
|
|
`[](${EXPECTED_BLOB_URL}/image.svg)`
|
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('image with absolute link', async () => {
|
|
|
|
expect(
|
|
|
|
completeRelativeUrls(
|
|
|
|
'[](https://example.com/image.svg)',
|
|
|
|
README_FILEPATH,
|
|
|
|
true,
|
|
|
|
'svg'
|
|
|
|
)
|
|
|
|
).toEqual(
|
|
|
|
`[](https://example.com/image.svg)`
|
|
|
|
)
|
|
|
|
})
|
|
|
|
})
|
2023-03-06 12:50:56 +09:00
|
|
|
|
|
|
|
describe('truncate to bytes tests', () => {
|
|
|
|
test('unicode aware truncation to a number of bytes', async () => {
|
|
|
|
expect(truncateToBytes('test string to be truncated', 10)).toEqual(
|
|
|
|
'test strin'
|
|
|
|
)
|
|
|
|
expect(truncateToBytes('😀😁😂🤣😃😄😅', 10)).toEqual('😀😁')
|
|
|
|
})
|
|
|
|
})
|