angular-material-npfixed
Version:
The Angular Material project is an implementation of Material Design in Angular.js. This project provides a set of reusable, well-tested, and accessible Material Design UI components. Angular Material is supported internally at Google by the Angular.js, M
171 lines (133 loc) • 5.58 kB
JavaScript
describe('CodepenDataAdapter', function() {
var codepenDataAdapter, demo, data, externalScripts;
beforeEach(module('docsApp'));
beforeEach(inject(function(_codepenDataAdapter_) {
codepenDataAdapter = _codepenDataAdapter_;
}));
beforeEach(function() {
externalScripts = [
'http://some-url-to-external-js-files-required-for-codepen'
];
demo = {
id: 'spec-demo',
title: 'demo-title',
module: 'demo-module',
files: {
index: {
contents: '<div></div>'
},
html: [],
css: [
{ contents: '.fake-class { color: red }' }
],
js: [
{ contents: 'angular.module("SomeOtherModule", ["Dependency1"]);' }
]
}
}
});
describe('#translate', function() {
describe('the most common usage', function() {
beforeEach(function() {
data = codepenDataAdapter.translate(demo, externalScripts);
});
it('provides the title of the codepen', function() {
expect(data.title).toBe(demo.title);
});
it('includes the core angular css', function() {
// NOTE: the release script replaces this localhost reference with
// 'https://gitcdn.link/repo/angular/bower-material/master/angular-material.css'
expect(data.css_external).toBe('http://localhost:8080/angular-material.css');
});
it('includes the external js files, including the asset cache required to serve svgs to codepen', function() {
var expected = [
'http://some-url-to-external-js-files-required-for-codepen',
'http://localhost:8080/angular-material.js',
'https://s3-us-west-2.amazonaws.com/s.cdpn.io/t-114/assets-cache.js'
].join(';');
expect(data.js_external).toBe(expected)
});
it('adds ng-app attribute to the index', function() {
expect(angular.element(data.html).attr('ng-app')).toBe('MyApp');
});
it('adds the demo id as a class attribute to the parent element on the index.html', function() {
expect(angular.element(data.html).hasClass(demo.id)).toBe(true);
});
it('replaces the demo module with the codepen module', function() {
expect(data.js).toBe("angular.module('MyApp');");
});
it('includes the demo css', function() {
expect(data.css).toBe('.fake-class { color: red }');
});
});
describe('when html templates are included in the demo', function() {
var template, $script;
beforeEach(function() {
template = {
name: 'template-name',
contents: "<div class='foo'>{{bar}}</div>"
};
demo.files.html.push(template);
data = codepenDataAdapter.translate(demo, externalScripts);
script = angular.element(data.html).find('script');
});
it('appends the template to the index', function() {
expect(script.html()).toBe(template.contents);
});
it('adds the ngTemplate to the script tag', function() {
expect(script.attr('type')).toBe('text/ng-template');
});
it('adds the template name as the id', function() {
expect(script.attr('id')).toBe(template.name);
});
});
describe('when the demo html includes a <code> block', function() {
it('escapes the ampersand, so that codepen does not unescape the angle brackets', function() {
demo.files.index.contents = '<div><code>>md-autocomplete<</code></div>';
data = codepenDataAdapter.translate(demo, externalScripts);
expect(angular.element(data.html).html()).toBe('<code>&gt;md-autocomplete&lt;</code>');
});
it('handles multiple code blocks', function() {
demo.files.index.contents = '<div><code>>md-autocomplete<</code><code>>md-input<</code></div>';
data = codepenDataAdapter.translate(demo, externalScripts);
expect(angular.element(data.html).html()).toBe('<code>&gt;md-autocomplete&lt;</code><code>&gt;md-input&lt;</code>');
});
});
describe('when the html example includes ', function() {
it('escapes the ampersand, so that the codepen does not translate to an invalid character', function() {
demo.files.index.contents = '<div> </div>';
data = codepenDataAdapter.translate(demo, externalScripts);
expect(angular.element(data.html).html()).toBe('&nbsp;&nbsp;');
});
});
describe('when the module definition in the js file is formatted in different ways', function() {
it('handles second argument on a new line', function() {
var script = "angular.module('test',\n \
[]);";
demo.files.js = [{ contents: script }];
data = codepenDataAdapter.translate(demo, externalScripts);
expect(data.js).toBe("angular.module('MyApp');");
});
it('handles dependencies on new lines', function() {
var script = "angular.module('test', [\n \
'Dep1',\n \
'Dep2',\n \
]);";
demo.files.js = [{ contents: script }];
data = codepenDataAdapter.translate(demo, externalScripts);
expect(data.js).toBe("angular.module('MyApp');");
});
it('handles module on a new line', function() {
var script = "angular\n\
.module('test', [\n \
'Dep1',\n \
'Dep2',\n \
]);";
demo.files.js = [{ contents: script }];
data = codepenDataAdapter.translate(demo, externalScripts);
expect(data.js).toBe("angular\n\
.module('MyApp');");
});
});
});
});