Skip to content

Commit

Permalink
refactor(transformers): remove promises
Browse files Browse the repository at this point in the history
  • Loading branch information
Benedikt Rötsch authored and Khaledgarbaya committed Apr 16, 2018
1 parent 5060d32 commit 64cdd94
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 51 deletions.
15 changes: 9 additions & 6 deletions lib/index.js
Expand Up @@ -90,19 +90,22 @@ export default function runContentfulImport (params) {
skipContentModel: options.skipContentModel
})
.then((destinationData) => {
ctx.sourceData = options.content
ctx.sourceDataUntransformed = options.content
ctx.destinationData = destinationData
assertDefaultLocale(ctx.sourceData, ctx.destinationData)
assertDefaultLocale(ctx.sourceDataUntransformed, ctx.destinationData)
})
})
},
{
title: 'Apply transformations to source data',
task: wrapTask((ctx) => {
return transformSpace(ctx.sourceData, ctx.destinationData)
.then((transformedSourceData) => {
ctx.sourceData = transformedSourceData
})
try {
const transformedSourceData = transformSpace(ctx.sourceDataUntransformed, ctx.destinationData)
ctx.sourceData = transformedSourceData
return Promise.resolve()
} catch (err) {
return Promise.reject(err)
}
})
},
{
Expand Down
30 changes: 12 additions & 18 deletions lib/transform/transform-space.js
@@ -1,4 +1,3 @@
import Promise from 'bluebird'
import { omit, defaults } from 'lodash/object'

import * as defaultTransformers from './transformers'
Expand All @@ -13,23 +12,18 @@ const spaceEntities = [
* is a need to transform data when copying it to the destination space
*/
export default function (
space, destinationSpace, customTransformers, entities = spaceEntities
sourceData, destinationData, customTransformers, entities = spaceEntities
) {
const transformers = defaults(customTransformers, defaultTransformers)
// TODO maybe we don't need promises here at all
const newSpace = omit(space, ...entities)
return Promise.reduce(entities, (newSpace, type) => {
const sortedEntities = sortEntries(space[type])
return Promise.map(
sortedEntities,
(entity) => Promise.resolve({
original: entity,
transformed: transformers[type](entity, destinationSpace[type])
})
)
.then((entities) => {
newSpace[type] = entities
return newSpace
})
}, newSpace)
const baseSpaceData = omit(sourceData, ...entities)

return entities.reduce((transformedSpaceData, type) => {
const sortedEntities = sortEntries(sourceData[type])
const transformedEntities = sortedEntities.map((entity) => ({
original: entity,
transformed: transformers[type](entity, destinationData[type])
}))
transformedSpaceData[type] = transformedEntities
return transformedSpaceData
}, baseSpaceData)
}
6 changes: 4 additions & 2 deletions test/unit/index.test.js
Expand Up @@ -7,12 +7,13 @@ import transformSpaceStub from '../../lib/transform/transform-space'
import initClientStub from '../../lib/tasks/init-client'
import getDestinationResponseStub from '../../lib/tasks/get-destination-data'
import contentfulImport from '../../lib/index'
import validations from '../../lib/utils/validations'

jest.mock('cli-table2')
jest.mock('../../lib/utils/validations', () => {
return {
assertPayload: jest.fn(),
assertDefaultLocale: jest.fn().mockImplementationOnce(() => { throw new Error('ContentfulMultiError') })
assertDefaultLocale: jest.fn()
}
})

Expand Down Expand Up @@ -55,7 +56,7 @@ jest.mock('../../lib/tasks/push-to-space/push-to-space', () => {
})
})
jest.mock('../../lib/transform/transform-space', () => {
return jest.fn((data) => Promise.resolve(data))
return jest.fn((data) => data)
})
jest.mock('../../lib/tasks/init-client', () => {
return jest.fn(() => (
Expand All @@ -73,6 +74,7 @@ afterEach(() => {

test('Stops import when default locales does not match', () => {
const errorLogFile = 'errorlogfile.json'
validations.assertDefaultLocale.mockImplementationOnce(() => { throw new Error('Invalid locale error') })
expect.assertions(1)
return contentfulImport({
errorLogFile,
Expand Down
44 changes: 19 additions & 25 deletions test/unit/transform/transform-space.test.js
Expand Up @@ -22,38 +22,32 @@ const destinationSpace = cloneDeep(space)
space.doNotTouch = true

test('applies transformers to give space data', () => {
return transformSpace(space, destinationSpace)
.then((result) => {
expect(result.contentTypes[0]).toHaveProperty('original')
expect(result.contentTypes[0]).toHaveProperty('transformed')
expect(result.entries[0]).toHaveProperty('original')
expect(result.entries[0]).toHaveProperty('transformed')
expect(result.assets[0]).toHaveProperty('original')
expect(result.assets[0]).toHaveProperty('transformed')
expect(result.locales[0]).toHaveProperty('original')
expect(result.locales[0]).toHaveProperty('transformed')
expect(result.webhooks[0]).toHaveProperty('original')
expect(result.webhooks[0]).toHaveProperty('transformed')
expect(result.doNotTouch).toBe(true)
})
const result = transformSpace(space, destinationSpace)
expect(result.contentTypes[0]).toHaveProperty('original')
expect(result.contentTypes[0]).toHaveProperty('transformed')
expect(result.entries[0]).toHaveProperty('original')
expect(result.entries[0]).toHaveProperty('transformed')
expect(result.assets[0]).toHaveProperty('original')
expect(result.assets[0]).toHaveProperty('transformed')
expect(result.locales[0]).toHaveProperty('original')
expect(result.locales[0]).toHaveProperty('transformed')
expect(result.webhooks[0]).toHaveProperty('original')
expect(result.webhooks[0]).toHaveProperty('transformed')
expect(result.doNotTouch).toBe(true)
})

test('applies custom transformers to give space data', () => {
return transformSpace(space, destinationSpace, {
const result = transformSpace(space, destinationSpace, {
entries: (entry) => 'transformed'
})
.then((result) => {
expect(result.entries[0].transformed).toBe('transformed')
})
expect(result.entries[0].transformed).toBe('transformed')
})

test('applies transformers to given entity types', () => {
space.customEntities = [{type: 'custom'}]
return transformSpace(space, destinationSpace, {}, ['entries'])
.then((result) => {
expect(result.contentTypes[0]).not.toHaveProperty('original')
expect(result.contentTypes[0]).not.toHaveProperty('transformed')
expect(result.entries[0]).toHaveProperty('original')
expect(result.entries[0]).toHaveProperty('transformed')
})
const result = transformSpace(space, destinationSpace, {}, ['entries'])
expect(result.contentTypes[0]).not.toHaveProperty('original')
expect(result.contentTypes[0]).not.toHaveProperty('transformed')
expect(result.entries[0]).toHaveProperty('original')
expect(result.entries[0]).toHaveProperty('transformed')
})

0 comments on commit 64cdd94

Please sign in to comment.