mirror of
https://github.com/kremalicious/gatsby-redirect-from.git
synced 2024-12-22 17:23:24 +01:00
Matthias Kretschmann
a036be8087
* async/await refactor, more testing * add funding docs * test fix * dependency updates
131 lines
3.5 KiB
JavaScript
131 lines
3.5 KiB
JavaScript
/**
|
|
* @jest-environment jsdom
|
|
*/
|
|
import { graphql } from 'gatsby'
|
|
import { createPages } from '../src/gatsby-node.js'
|
|
|
|
jest.mock('gatsby', () => ({
|
|
graphql: jest.fn(),
|
|
actions: { createRedirect: jest.fn() }
|
|
}))
|
|
|
|
describe('createPages', () => {
|
|
let pluginOptions
|
|
let actions
|
|
let consoleLogSpy
|
|
|
|
const markdownQuery = 'allMarkdownRemark'
|
|
const edges = [
|
|
{
|
|
node: {
|
|
fields: { slug: '/post-1' },
|
|
frontmatter: { redirect_from: ['/old-url-1', '/old-url-2'] }
|
|
}
|
|
},
|
|
{
|
|
node: {
|
|
fields: { slug: '/post-2' },
|
|
frontmatter: { redirect_from: ['/old-url-3'] }
|
|
}
|
|
}
|
|
]
|
|
|
|
beforeEach(() => {
|
|
actions = { createRedirect: jest.fn() }
|
|
pluginOptions = { query: 'allMarkdownRemark' }
|
|
consoleLogSpy = jest.spyOn(console, 'log').mockImplementation(() => {})
|
|
})
|
|
|
|
afterEach(() => {
|
|
jest.resetAllMocks()
|
|
consoleLogSpy.mockRestore()
|
|
})
|
|
|
|
it('should create redirects for each post with a redirect_from field', async () => {
|
|
const data = { q: { edges } }
|
|
graphql.mockReturnValueOnce(Promise.resolve({ data }))
|
|
const createRedirectSpy = jest.spyOn(actions, 'createRedirect')
|
|
|
|
await createPages({ graphql, actions }, { query: markdownQuery })
|
|
|
|
expect(createRedirectSpy).toHaveBeenCalledTimes(3)
|
|
expect(createRedirectSpy).toHaveBeenCalledWith({
|
|
fromPath: '/old-url-1',
|
|
toPath: '/post-1',
|
|
isPermanent: true,
|
|
redirectInBrowser: true
|
|
})
|
|
expect(createRedirectSpy).toHaveBeenCalledWith({
|
|
fromPath: '/old-url-2',
|
|
toPath: '/post-1',
|
|
isPermanent: true,
|
|
redirectInBrowser: true
|
|
})
|
|
expect(createRedirectSpy).toHaveBeenCalledWith({
|
|
fromPath: '/old-url-3',
|
|
toPath: '/post-2',
|
|
isPermanent: true,
|
|
redirectInBrowser: true
|
|
})
|
|
|
|
createRedirectSpy.mockRestore()
|
|
})
|
|
|
|
it('should use pluginOptions.query when defined', async () => {
|
|
const customQuery = 'someCustomQuery'
|
|
pluginOptions.query = customQuery
|
|
|
|
graphql.mockImplementation((queryString) => {
|
|
expect(queryString).toContain(customQuery)
|
|
return Promise.resolve({ data: { q: { edges: [] } } })
|
|
})
|
|
|
|
await createPages({ graphql, actions }, pluginOptions)
|
|
})
|
|
|
|
it('should default to allMarkdownRemark when pluginOptions.query is undefined', async () => {
|
|
pluginOptions.query = undefined
|
|
|
|
graphql.mockImplementation((queryString) => {
|
|
expect(queryString).toContain('allMarkdownRemark')
|
|
return Promise.resolve({ data: { q: { edges: [] } } })
|
|
})
|
|
|
|
await createPages({ graphql, actions }, pluginOptions)
|
|
})
|
|
|
|
it('should log a success message when redirects are created', async () => {
|
|
const data = { q: { edges } }
|
|
graphql.mockReturnValueOnce(Promise.resolve({ data }))
|
|
const createRedirectSpy = jest.spyOn(actions, 'createRedirect')
|
|
|
|
await createPages({ graphql, actions }, { query: markdownQuery })
|
|
|
|
expect(createRedirectSpy).toHaveBeenCalledTimes(3)
|
|
expect(console.log).toHaveBeenCalledWith(
|
|
'%c %s %c %s',
|
|
'color:green',
|
|
'success',
|
|
'color:none',
|
|
'created 3 redirects'
|
|
)
|
|
})
|
|
|
|
it('should log an error message when an error occurs', async () => {
|
|
const error = new Error('GraphQL query failed')
|
|
graphql.mockImplementationOnce(() => {
|
|
throw error
|
|
})
|
|
|
|
const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => {})
|
|
|
|
try {
|
|
await createPages({ graphql, actions }, pluginOptions)
|
|
} catch (error) {
|
|
expect(console.error).toHaveBeenCalledWith('GraphQL query failed')
|
|
}
|
|
|
|
consoleSpy.mockRestore()
|
|
})
|
|
})
|