Skip to content

Commit

Permalink
Tests updates and cleanup.
Browse files Browse the repository at this point in the history
  • Loading branch information
avimehta committed Nov 22, 2016
1 parent be874ba commit 8a63990
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 34 deletions.
14 changes: 12 additions & 2 deletions extensions/amp-analytics/0.1/test/test-variables.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,9 @@ describe('amp-analytics.VariableService', function() {
return check('${bar|default:baz}', 'baz');
});

it.skip('hash works', () => {
return check('${foo|hash}', 'baz');
it('hash works', () => {
return check('${foo|hash}',
'8R9LfzzIKtjQOwqNEUN5Tw3-oUTgU2UvtufGxDh4wRiiacsW5yga9nqHSYBoBkkp');
});
it('substr works', () => {
return check('${foo|substr:2:4}', 'ello');
Expand All @@ -117,5 +118,14 @@ describe('amp-analytics.VariableService', function() {
it('if works', () => {
return check('${foo|if:yey:boo}', 'yey');
});

it('chaining works', () => {
return check('${foo|substr:6}', '%20world!%20').then(() =>
check('${foo|substr:6|trim}', 'world!')).then(() =>
check('${foo|substr:6|trim|toUpperCase}', 'WORLD!')).then(() =>
check('${foo|substr:6|trim|toUpperCase|base64}', 'V09STEQh')).then(() =>
check('${foo|substr:6|trim|toUpperCase|base64|hash}',
'OPTTt2IGW8-R31MrIF_cRUwLTZ9jLDOXEuhNz_QS7Uc5ZmODduHWdplzrZ7Jsnqx'));
});
});
});
55 changes: 23 additions & 32 deletions extensions/amp-analytics/0.1/variables.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,9 @@ import {cryptoFor} from '../../../src/crypto';

const TAG = 'Analytics.Variables';

/** @typedef {function(...?):!Promise<?>} */
/** @typedef {function(...?):!Promise<?>|string} */
let VariableFilterDef;

/** @typedef {function(...?):?} */
let SyncVariableFilterDef;

/**
* @param {!string} str
* @param {Number} s
Expand All @@ -35,11 +32,14 @@ let SyncVariableFilterDef;
*/
function substrFilter(str, s, l) {
const start = Number(s);
const length = Number(l);
let length = str.length;
user().assertNumber(start,
'Start index ' + start + 'in substr filter should be a number');
user().assertNumber(length,
'Length ' + length + ' in substr filter should be a number');
'Start index ' + start + 'in substr filter should be a number');
if (l) {
length = user().assertNumber(Number(l),
'Length ' + length + ' in substr filter should be a number');
}

return str.substr(start, length);
}

Expand Down Expand Up @@ -68,16 +68,16 @@ export class VariableService {
/** @private {./crypto-impl.Crypto} */
this.crypto_ = null;

this.registerSync_('default', defaultFilter);
this.registerSync_('substr', substrFilter);
this.registerSync_('trim', value => user().assertString(value).trim());
this.registerSync_('json', value => JSON.stringify(value));
this.registerSync_('toLowerCase', value =>
this.register_('default', defaultFilter);
this.register_('substr', substrFilter);
this.register_('trim', value => user().assertString(value).trim());
this.register_('json', value => JSON.stringify(value));
this.register_('toLowerCase', value =>
user().assertString(value).toLowerCase());
this.registerSync_('toUpperCase', value =>
this.register_('toUpperCase', value =>
user().assertString(value).toUpperCase());
this.registerSync_('not', value => String(!value));
this.registerSync_('base64', value => btoa(String(value)));
this.register_('not', value => String(!value));
this.register_('base64', value => btoa(String(value)));
this.register_('hash', this.hashFilter_.bind(this));
this.register_('if', (value, thenValue, elseValue) =>
Promise.resolve(value ? thenValue : elseValue));
Expand All @@ -98,18 +98,6 @@ export class VariableService {
this.filters_[name] = handler;
}

/**
* @param {string} name
* @param {SyncVariableFilterDef} handler
*/
registerSync_(name, handler) {
this.register_(name, (...args) =>
Promise.resolve(args[0]).then(value => {
args.splice(0, 1, value);
return handler.apply(null, args);
}));
}

/**
* @param {string} filterStr
* @return {!Object<string, *>}
Expand All @@ -135,17 +123,20 @@ export class VariableService {
/**
* @param {string} value
* @param {Array<string>} filters
* @return {string}
* @return {Promise<string>}
*/
applyFilters_(value, filters) {
let result = Promise.resolve(value);
for (let i = 0; i < filters.length; i++) {
const parsedFilter = this.parseFilter_(filters[i].trim());
if (parsedFilter) {
parsedFilter.args.unshift(value);
value = parsedFilter.fn.apply(null, parsedFilter.args);
result = result.then(value => {
parsedFilter.args.unshift(value);
return parsedFilter.fn.apply(null, parsedFilter.args);
});
}
}
return value;
return result;
}

/**
Expand Down

0 comments on commit 8a63990

Please sign in to comment.