Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update: added migration scripts (fixes #235) #236

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
237 changes: 237 additions & 0 deletions migrations/v2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,237 @@
import { describe, getConfig, whereContent, whereFromPlugin, mutateContent, checkContent, updatePlugin } from 'adapt-migrations';
import _ from 'lodash';

describe('Trickle - v2.1.1 to v2.1.2', async () => {
// https://github.com/adaptlearning/adapt-contrib-trickle/compare/v2.1.1..v2.1.2

let configuredBlocks, configuredArticles;

whereFromPlugin('Trickle - from v2.1.1', { name: 'adapt-contrib-trickle', version: '<2.1.2' });

whereContent('Trickle is configured', content => {
configuredBlocks = content.filter(({ _type, _trickle }) => _trickle && _type === 'block');
configuredArticles = content.filter(({ _type, _trickle }) => _trickle && _type === 'article');
return configuredBlocks.length || configuredArticles.length;
});

mutateContent('Trickle - add block attribute startText', async (content) => {
configuredBlocks.forEach(block => {
if (!_.has(block._trickle, '_button')) _.set(block._trickle, '_button', {});
block._trickle._button.startText = 'Begin';
});

return true;
});

mutateContent('Trickle - add block attribute finalText', async (content) => {
configuredBlocks.forEach(block => {
if (!_.has(block._trickle, '_button')) _.set(block._trickle, '_button', {});
block._trickle._button.finalText = 'Finish';
});

return true;
});

mutateContent('Trickle - add article attribute startText', async (content) => {
configuredArticles.forEach(article => {
if (!_.has(article._trickle, '_button')) _.set(article._trickle, '_button', {});
article._trickle._button.startText = 'Begin';
});

return true;
});

checkContent('Trickle - check block attribute startText', async (content) => {
const isValid = configuredBlocks.every(block => block._trickle._button.startText === 'Begin');

if (!isValid) throw new Error('Trickle - block attribute startText');

return true;
});

checkContent('Trickle - check block attribute finalText', async (content) => {
const isValid = configuredBlocks.every(block => block._trickle._button.finalText === 'Finish');

if (!isValid) throw new Error('Trickle - block attribute finalText');

return true;
});

checkContent('Trickle - check article attribute startText', async (content) => {
const isValid = configuredArticles.every(article => article._trickle._button.startText === 'Begin');

if (!isValid) throw new Error('Trickle - article attribute startText');

return true;
});

updatePlugin('Trickle - update to v2.1.2', { name: 'adapt-contrib-trickle', version: '2.1.2', framework: '">=2.0.6' });
});

describe('Trickle - v2.1.3 to v2.1.5', async () => {
// https://github.com/adaptlearning/adapt-contrib-trickle/compare/v2.1.3..v2.1.5

let config, configuredBlocks, configuredArticles;

whereFromPlugin('Trickle - from v2.1.3', { name: 'adapt-contrib-trickle', version: '<2.1.5' });

whereContent('Trickle is configured', content => {
config = getConfig(content);
configuredBlocks = content.filter(({ _type, _trickle }) => _trickle && _type === 'block');
configuredArticles = content.filter(({ _type, _trickle }) => _trickle && _type === 'article');
return config._trickle || configuredBlocks.length || configuredArticles.length;
});

mutateContent('Trickle - update config attribute _completionAttribute', async (content) => {
if (config?._completionAttribute === '_isInteractionComplete') {
config._completionAttribute = '_isComplete';
}

return true;
});

mutateContent('Trickle - update article attribute _button._isFullWidth', async (content) => {
configuredArticles.forEach(article => {
if (article._trickle._button?._isFullWidth !== 'true') return;
article._trickle._button._isFullWidth = true;
});

return true;
});

mutateContent('Trickle - update article attribute _button._autoHide', async (content) => {
configuredArticles.forEach(article => {
if (article._trickle._button?._autoHide !== 'true') return;
article._trickle._button._autoHide = true;
});

return true;
});

mutateContent('Trickle - update block attribute _isEnabled', async (content) => {
configuredBlocks.forEach(block => {
if (_.has(block._trickle, '_isEnabled')) return;
block._trickle._isEnabled = true;
});

return true;
});

mutateContent('Trickle - update block attribute _button._isEnabled', async (content) => {
configuredBlocks.forEach(block => {
if (_.has(block._trickle, '_button._isEnabled')) return;
block._trickle._button._isEnabled = true;
});

return true;
});

mutateContent('Trickle - update block attribute _button._isFullWidth', async (content) => {
configuredBlocks.forEach(block => {
if (block._trickle._button?._isFullWidth !== 'true') return;
block._trickle._button._isFullWidth = true;
});

return true;
});

mutateContent('Trickle - update block attribute _button._autoHide', async (content) => {
configuredBlocks.forEach(block => {
if (block._trickle._button?._autoHide !== 'true') return;
block._trickle._button._autoHide = true;
});

return true;
});

checkContent('Trickle - check config attribute _completionAttribute', async (content) => {
const isValid = config?._completionAttribute !== '_isInteractionComplete';

if (!isValid) throw new Error('Trickle - config attribute _completionAttribute');

return true;
});

checkContent('Trickle - check article attribute _button._isFullWidth', async (content) => {
const isValid = configuredArticles.every(({ _trickle }) => !_.has(_trickle, '_button') || _trickle._button._isFullWidth !== 'true');

if (!isValid) throw new Error('Trickle - article attribute _button._isFullWidth');

return true;
});

checkContent('Trickle - check article attribute _button._autoHide', async (content) => {
const isValid = configuredArticles.every(({ _trickle }) => !_.has(_trickle, '_button') || _trickle._button._autoHide !== 'true');

if (!isValid) throw new Error('Trickle - article attribute _button._autoHide');

return true;
});

checkContent('Trickle - check block attribute _isEnabled', async (content) => {
const isValid = configuredBlocks.every(block => _.has(block._trickle, '_isEnabled'));

if (!isValid) throw new Error('Trickle - block attribute _isEnabled');

return true;
});

checkContent('Trickle - check block attribute _button._isEnabled', async (content) => {
const isValid = configuredBlocks.every(({ _trickle }) => !_.has(_trickle, '_button') || _.has(_trickle._button, '_isEnabled'));

if (!isValid) throw new Error('Trickle - block attribute _button._isEnabled');

return true;
});

checkContent('Trickle - check block attribute _button._isFullWidth', async (content) => {
const isValid = configuredBlocks.every(({ _trickle }) => !_.has(_trickle, '_button') || _trickle._button._isFullWidth !== 'true');

if (!isValid) throw new Error('Trickle - block attribute _button._isFullWidth');

return true;
});

checkContent('Trickle - check block attribute _button._autoHide', async (content) => {
const isValid = configuredBlocks.every(({ _trickle }) => !_.has(_trickle, '_button') || _trickle._button._autoHide !== 'true');

if (!isValid) throw new Error('Trickle - block attribute _button._autoHide');

return true;
});

updatePlugin('Trickle - update to v2.1.5', { name: 'adapt-contrib-trickle', version: '2.1.5', framework: '">=2.2' });
});

describe('Trickle - v2.1.5 to v2.2.0', async () => {
// https://github.com/adaptlearning/adapt-contrib-trickle/compare/v2.1.5..v2.2.0

let course, courseTrickleGlobals;
const incompleteContent = 'There is incomplete content above. You must complete this before you can proceed through the course.';

whereFromPlugin('Trickle - from v2.1.5', { name: 'adapt-contrib-trickle', version: '<2.2.0' });

whereContent('Trickle is configured', content => {
course = content.find(({ _type }) => _type === 'course');
return getConfig(content)._trickle;
});

mutateContent('Trickle - add globals if missing', async (content) => {
if (!_.has(course, '_globals._extensions._trickle')) _.set(course, '_globals._extensions._trickle', {});
courseTrickleGlobals = course._globals._extensions._trickle;
return true;
});

mutateContent('Trickle - global attribute incompleteContent', async (content) => {
courseTrickleGlobals.incompleteContent = incompleteContent;
return true;
});

checkContent('Trickle - check global attribute incompleteContent', async (content) => {
const isValid = course._globals._extensions._trickle.incompleteContent === incompleteContent;
if (!isValid) throw new Error('Trickle - global attribute incompleteContent');
return true;
});

updatePlugin('Trickle - update to v2.2.0', { name: 'adapt-contrib-trickle', version: '2.2.0', framework: '">=2.2' });
});
62 changes: 62 additions & 0 deletions migrations/v3.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { describe, whereContent, whereFromPlugin, mutateContent, checkContent, updatePlugin } from 'adapt-migrations';
import _ from 'lodash';

describe('Trickle - v2.2.1 to v3.0.0', async () => {
// https://github.com/adaptlearning/adapt-contrib-trickle/compare/v2.2.1..v3.0.0

let configuredBlocks, configuredArticles;

whereFromPlugin('Trickle - from v2.2.1', { name: 'adapt-contrib-trickle', version: '<3.0.0' });

whereContent('Trickle is configured', content => {
configuredBlocks = content.filter(({ _type, _trickle }) => _trickle && _type === 'block');
configuredArticles = content.filter(({ _type, _trickle }) => _trickle && _type === 'article');
return configuredBlocks.length || configuredArticles.length;
});

mutateContent('Trickle - update article attribute _scrollDuration', async (content) => {
configuredArticles.forEach(article => {
// convert any string representing a finite number to type Number otherwise leave as-is
const scrollDuration = _.toNumber(article._trickle._scrollDuration);
if (!_.isFinite(scrollDuration)) return;
article._trickle._scrollDuration = scrollDuration;
});

return true;
});

mutateContent('Trickle - update block attribute _scrollDuration', async (content) => {
configuredBlocks.forEach(block => {
// convert any string representing a finite number to type Number otherwise leave as-is
const scrollDuration = _.toNumber(block._trickle._scrollDuration);
if (!_.isFinite(scrollDuration)) return;
block._trickle._scrollDuration = scrollDuration;
});

return true;
});

checkContent('Trickle - check article attribute _scrollDuration', async (content) => {
const isValid = configuredArticles.every(({ _trickle }) => {
const scrollDuration = _.toNumber(_trickle._scrollDuration);
return !_.isFinite(scrollDuration) || _trickle._scrollDuration === scrollDuration;
});

if (!isValid) throw new Error('Trickle - article attribute _scrollDuration');

return true;
});

checkContent('Trickle - check block attribute _scrollDuration', async (content) => {
const isValid = configuredBlocks.every(({ _trickle }) => {
const scrollDuration = _.toNumber(_trickle._scrollDuration);
return !_.isFinite(scrollDuration) || _trickle._scrollDuration === scrollDuration;
});

if (!isValid) throw new Error('Trickle - block attribute _scrollDuration');

return true;
});

updatePlugin('Trickle - update to v3.0.0', { name: 'adapt-contrib-trickle', version: '3.0.0', framework: '">=3' });
});
52 changes: 52 additions & 0 deletions migrations/v4.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { describe, whereContent, whereFromPlugin, mutateContent, checkContent, updatePlugin } from 'adapt-migrations';
import _ from 'lodash';

describe('Trickle - v3.0.1 to v4.0.0', async () => {
// https://github.com/adaptlearning/adapt-contrib-trickle/compare/v3.0.1..v4.0.0

let configuredBlocks, configuredArticles;

whereFromPlugin('Trickle - from v3.0.1', { name: 'adapt-contrib-trickle', version: '<4.0.0' });

whereContent('Trickle is configured', content => {
configuredBlocks = content.filter(({ _type, _trickle }) => _trickle && _type === 'block');
configuredArticles = content.filter(({ _type, _trickle }) => _trickle && _type === 'article');
return configuredBlocks.length || configuredArticles.length;
});

mutateContent('Trickle - add block attribute _hasIcon', async (content) => {
configuredBlocks.forEach(block => {
if (!_.has(block._trickle, '_button')) _.set(block._trickle, '_button', {});
block._trickle._button._hasIcon = false;
});

return true;
});

mutateContent('Trickle - add article attribute _hasIcon', async (content) => {
configuredArticles.forEach(article => {
if (!_.has(article._trickle, '_button')) _.set(article._trickle, '_button', {});
article._trickle._button._hasIcon = false;
});

return true;
});

checkContent('Trickle - check block attribute _hasIcon', async (content) => {
const isValid = configuredBlocks.every(block => block._trickle._button._hasIcon === false);

if (!isValid) throw new Error('Trickle - block attribute _hasIcon');

return true;
});

checkContent('Trickle - check article attribute _hasIcon', async (content) => {
const isValid = configuredArticles.every(article => article._trickle._button._hasIcon === false);

if (!isValid) throw new Error('Trickle - article attribute _hasIcon');

return true;
});

updatePlugin('Trickle - update to v4.0.0', { name: 'adapt-contrib-trickle', version: '4.0.0', framework: '">=5' });
});
Loading
Loading