mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-18 19:21:34 +08:00
316 lines
12 KiB
JavaScript
316 lines
12 KiB
JavaScript
var fs = require('fs'),
|
|
path = require('path'),
|
|
Generate = require('../generate'),
|
|
_ = require('lodash'),
|
|
shell = require('shelljs');
|
|
|
|
// logging.logger = helpers.testingLogger;
|
|
|
|
// global.console.debug = function(arguments) {
|
|
// console.log(arguments)
|
|
// }
|
|
|
|
describe('#Generate', function() {
|
|
it('should have generate exported', function() {
|
|
expect(Generate).toBeDefined();
|
|
expect(Generate.page).toBeDefined();
|
|
});
|
|
|
|
ddescribe('#generators', function() {
|
|
it('should have a list of generators', function() {
|
|
expect(Generate.generators).toBeDefined();
|
|
expect(Object.keys(Generate.generators).length).toBeGreaterThan(0);
|
|
expect(Generate.generators.page).toBeDefined();
|
|
expect(Generate.generators['page-tabs']).toBeDefined();
|
|
});
|
|
|
|
it('should be able to load generators', function() {
|
|
spyOn(fs, 'readdirSync').andReturn(['page']);
|
|
Generate.loadGenerators();
|
|
expect(fs.readdirSync).toHaveBeenCalled();
|
|
});
|
|
|
|
it('should throw an exception if a generator does not get options passed', function() {
|
|
expect(Generate.generate).toThrow('No options passed to generator');
|
|
});
|
|
|
|
it('should throw an error trying to use a generator that does not exist', function() {
|
|
var generatorOptions = { appDirectory: '/fake/ionic/path', name: 'About', generatorName: 'tabz' };
|
|
expect(function() {
|
|
Generate.generate(generatorOptions);
|
|
}).toThrow('There is no generator available with that name: tabz.');
|
|
});
|
|
|
|
it('should call the appropriate generator', function() {
|
|
spyOn(Generate, 'createScaffoldDirectories');
|
|
var generatorOptions = { appDirectory: '/fake/ionic/path', name: 'About', generatorName: 'page' };
|
|
var generatorSpy = {run: createSpy()};
|
|
var realGenerator = Generate.generators['page'];
|
|
Generate.generators['page'] = generatorSpy;
|
|
|
|
Generate.generate(generatorOptions);
|
|
|
|
var genOpts = {
|
|
appDirectory: '/fake/ionic/path',
|
|
cssClassName: 'about',
|
|
fileName: 'about',
|
|
jsClassName: 'About',
|
|
name: 'About',
|
|
template: 'page'
|
|
}
|
|
|
|
expect(generatorSpy.run).toHaveBeenCalledWith(genOpts);
|
|
|
|
Generate.generators['page'] = realGenerator;
|
|
});
|
|
|
|
describe('#generate:page', function() {
|
|
it('should generate all the templates for a page', function() {
|
|
var generatorOptions = { appDirectory: '/ionic/app/dir', name: 'About', generatorName: 'page' };
|
|
var genOpts = {
|
|
appDirectory: '/ionic/app/dir',
|
|
fileName: 'about',
|
|
cssClassName: 'about',
|
|
jsClassName: 'About',
|
|
name: 'About',
|
|
template: 'page'
|
|
};
|
|
|
|
spyOn(fs, 'writeFileSync');
|
|
spyOn(Generate, 'createScaffoldDirectories');
|
|
|
|
Generate.generate(generatorOptions);
|
|
|
|
expect(fs.writeFileSync.calls.length).toBe(3);
|
|
|
|
});
|
|
});
|
|
});
|
|
|
|
xdescribe('#page', function() {
|
|
|
|
it('should generate a page at a directory', function() {
|
|
//ionic g page about
|
|
//what should happen:
|
|
// create directories if not existing: /www, /www/app, /www/app/about
|
|
// create files in dir: /www/app/about/
|
|
// about.html, about.scss, about.js
|
|
var appDir = '/ionic/app';
|
|
spyOn(Generate, 'createScaffoldDirectories');
|
|
spyOn(fs, 'writeFileSync');
|
|
spyOn(Generate, 'generateHtmlTemplate');
|
|
spyOn(Generate, 'generateScssTemplate');
|
|
spyOn(Generate, 'generateJsTemplate');
|
|
|
|
Generate.page(appDir, 'about');
|
|
|
|
expect(Generate.createScaffoldDirectories).toHaveBeenCalledWith(appDir, 'about');
|
|
expect(Generate.generateJsTemplate).toHaveBeenCalledWith('about');
|
|
expect(Generate.generateHtmlTemplate).toHaveBeenCalledWith('about');
|
|
expect(Generate.generateScssTemplate).toHaveBeenCalledWith('about');
|
|
|
|
expect(fs.writeFileSync).toHaveBeenCalled();
|
|
|
|
});
|
|
|
|
it('should generate a page code template', function() {
|
|
var scaffold = 'about';
|
|
var compiledTemplate = Generate.generateJsTemplate(scaffold);
|
|
expect(compiledTemplate).toContain('templateUrl: \'app/about/about.html\'');
|
|
expect(compiledTemplate).toContain('export class About');
|
|
});
|
|
|
|
it('should generate a properly cased page template', function() {
|
|
var scaffold = 'scheduleDetail';
|
|
var compiledTemplate = Generate.generateJsTemplate(scaffold);
|
|
expect(compiledTemplate).toContain('templateUrl: \'app/schedule-detail/schedule-detail.html\'');
|
|
expect(compiledTemplate).not.toContain('export class scheduleDetail');
|
|
expect(compiledTemplate).toContain('export class ScheduleDetail');
|
|
});
|
|
|
|
it('should generate a page html template', function() {
|
|
var scaffold = 'sessions';
|
|
var compiledTemplate = Generate.generateHtmlTemplate(scaffold);
|
|
expect(compiledTemplate).toContain('<ion-content padding class="sessions">');
|
|
expect(compiledTemplate).toContain('<ion-title>Sessions</ion-title>');
|
|
|
|
});
|
|
|
|
it('should generate a page sass template', function() {
|
|
var scaffold = 'sessions';
|
|
var compiledTemplate = Generate.generateScssTemplate(scaffold);
|
|
expect(compiledTemplate).toContain('.sessions {');
|
|
});
|
|
|
|
it('should render html template from file', function() {
|
|
spyOn(fs, 'readFileSync').andReturn('faketemplate');
|
|
var templateSpy = createSpy();
|
|
|
|
spyOn(_, 'template').andReturn(templateSpy);
|
|
var options = { name: 'test', capitalizedName: 'Test', templatePath: '/path/to/template.tmpl.html'};
|
|
var generatedContents = Generate.renderTemplateFromFile(options);
|
|
expect(fs.readFileSync).toHaveBeenCalledWith(options.templatePath, 'utf8');
|
|
expect(_.template).toHaveBeenCalledWith('faketemplate');
|
|
expect(templateSpy).toHaveBeenCalledWith(options);
|
|
});
|
|
}); //#page
|
|
|
|
xdescribe('#directories', function() {
|
|
it('should create directories for scaffolding', function() {
|
|
// pwd = /ionic/app
|
|
// ionic g page about
|
|
// create folders in /ionic/app/www/app/about
|
|
spyOn(shell, 'mkdir');
|
|
Generate.createScaffoldDirectories('/ionic/app', 'about');
|
|
expect(shell.mkdir).toHaveBeenCalledWith('-p', '/ionic/app/www/app/about');
|
|
});
|
|
}); //#directories
|
|
|
|
xdescribe('#tabs', function() {
|
|
it('should create a tab template with tab pages', function() {
|
|
/*
|
|
ionic g tabs MyTabPage
|
|
> How many tabs?
|
|
$ 3
|
|
> What do you want to call tab 1?
|
|
$ About
|
|
> What do you want to call tab 2?
|
|
$ Schedule
|
|
> What do you want to call tab 3?
|
|
$ Sessions
|
|
|
|
generates:
|
|
www/app/my-tab-page/my-tab-page.html
|
|
www/app/my-tab-page/my-tab-page.js
|
|
www/app/my-tab-page/my-tab-page.scss
|
|
|
|
www/app/about/about.js
|
|
www/app/about/about.html
|
|
www/app/about/about.scss
|
|
|
|
www/app/schedule/schedule.js
|
|
www/app/schedule/schedule.html
|
|
www/app/schedule/schedule.scss
|
|
|
|
www/app/sessions/sessions.js
|
|
www/app/sessions/sessions.html
|
|
www/app/sessions/sessions.scss
|
|
*/
|
|
|
|
var tabPage = 'TabPage';
|
|
var tabs = ['About', 'Schedule', 'Sessions'];
|
|
var appDirectory = '/ionic/project';
|
|
|
|
spyOn(Generate, 'createScaffoldDirectories');
|
|
|
|
//Generate the tabs - that contains links/tab entries for the
|
|
//other tabs
|
|
spyOn(Generate, 'generateTabsHtmlTemplate');
|
|
spyOn(Generate, 'generateTabsJsTemplate');
|
|
spyOn(Generate, 'generateTabsScssTemplate');
|
|
|
|
//Generate the individual tab pages - 4 in total
|
|
spyOn(Generate, 'generateTabHtmlTemplate');
|
|
spyOn(Generate, 'generateTabJsTemplate');
|
|
spyOn(Generate, 'generateTabScssTemplate');
|
|
|
|
Generate.tabPages(appDirectory, tabPage, tabs);
|
|
|
|
expect(Generate.createScaffoldDirectories.calls).toBe(4);
|
|
|
|
//tabs
|
|
expect(Generate.generateTabsHtmlTemplate.calls).toBe(1);
|
|
expect(Generate.generateTabsJsTemplate.calls).toBe(1);
|
|
expect(Generate.generateTabsScssTemplate.calls).toBe(1);
|
|
|
|
//tab
|
|
expect(Generate.generateTabHtmlTemplate.calls).toBe(3);
|
|
expect(Generate.generateTabJsTemplate.calls).toBe(3);
|
|
expect(Generate.generateTabScssTemplate.calls).toBe(3);
|
|
});
|
|
|
|
it('should generate a page with tabs', function() {
|
|
// This is what we want for a page with 2 tabs (about, map):
|
|
// <ion-tabs>
|
|
// <ion-tab tab-title="About" tab-icon="information-circle" [root]="tab4"></ion-tab>
|
|
// <ion-tab tab-title="Map" tab-icon="map" [root]="tab3"></ion-tab>
|
|
// </ion-tabs>
|
|
|
|
// Setup:
|
|
// spyOn(Generate, 'createScaffoldDirectories');
|
|
|
|
// Execute:
|
|
var tabsHtml = Generate.generateTabsHtmlTemplate('/ionic/app/path', 'TabsPage', ['About', 'Map']);
|
|
|
|
// Assert:
|
|
expect(tabsHtml).toContain('<ion-tabs>');
|
|
expect(tabsHtml).toContain('<ion-tab tab-title="About" tab-icon="globe" [root]="About">');
|
|
expect(tabsHtml).toContain('<ion-tab tab-title="Map" tab-icon="globe" [root]="Map">');
|
|
expect(tabsHtml).toContain('</ion-tabs>');
|
|
});
|
|
|
|
it('should generate a tabs page javascript template', function() {
|
|
// import {NavController, Page} from 'ionic/ionic';
|
|
// <% _.forEach(tabs, function(tab) { %>
|
|
// import {<%= tab.jsClassName %>} from '../<%= tab.filename %>/<%= tab.filename %>';
|
|
// <% }); %>
|
|
// @Page({
|
|
// templateUrl: 'app/<%= filename %>/<%= filename %>.html',
|
|
// providers: [DataService]
|
|
// })
|
|
// class ConferenceApp {
|
|
// constructor(nav: NavController) {
|
|
// // set the root pages for each tab
|
|
// <% _.forEach(tabs, function(tab) { %>
|
|
// this.{<%= tab.jsClassName %>} = <%= tab.jsClassName %>;
|
|
// <% }); %>
|
|
// }
|
|
// }
|
|
|
|
var tabsJs = Generate.generateTabsJsTemplate('/ionic/app/path', 'TabsPage', ['About', 'Map']);
|
|
|
|
expect(tabsJs).toContain('import {About} from \'../about/about\';')
|
|
expect(tabsJs).toContain('import {Map} from \'../map/map\';')
|
|
expect(tabsJs).toContain('templateUrl: \'app/tabs-page/tabs-page.html');
|
|
expect(tabsJs).toContain('export class TabsPage {');
|
|
expect(tabsJs).toContain('this.About = About;');
|
|
expect(tabsJs).toContain('this.Map = Map;');
|
|
|
|
|
|
|
|
});
|
|
});//#tabs
|
|
|
|
xdescribe('#naming', function() {
|
|
it('should capitalize names', function() {
|
|
expect(Generate.capitalizeName('session')).toBe('Session');
|
|
});
|
|
|
|
it('should generate the correct file and css class name', function() {
|
|
expect(Generate.fileName('session')).toBe('session');
|
|
expect(Generate.fileName('Session')).toBe('session');
|
|
expect(Generate.fileName('SESSION')).toBe('session');
|
|
expect(Generate.fileName('sessionDetail')).toBe('session-detail');
|
|
expect(Generate.fileName('SessionDetail')).toBe('session-detail');
|
|
expect(Generate.fileName('SesSionDetail')).toBe('ses-sion-detail');
|
|
expect(Generate.fileName('seSsionDeTail')).toBe('se-ssion-de-tail');
|
|
expect(Generate.fileName('session-detail')).toBe('session-detail');
|
|
expect(Generate.fileName('Session-Detail')).toBe('session-detail');
|
|
expect(Generate.fileName('Session_Detail')).toBe('session-detail');
|
|
});
|
|
|
|
it('should generate the correct javascript class name', function() {
|
|
expect(Generate.jsClassName('session')).toBe('Session');
|
|
expect(Generate.jsClassName('Session')).toBe('Session');
|
|
expect(Generate.jsClassName('SESSION')).toBe('Session');
|
|
expect(Generate.jsClassName('sessionDetail')).toBe('SessionDetail');
|
|
expect(Generate.jsClassName('SessionDetail')).toBe('SessionDetail');
|
|
expect(Generate.jsClassName('SesSionDetail')).toBe('SesSionDetail');
|
|
expect(Generate.jsClassName('seSsionDeTail')).toBe('SeSsionDeTail');
|
|
expect(Generate.jsClassName('session-detail')).toBe('SessionDetail');
|
|
expect(Generate.jsClassName('Session-Detail')).toBe('SessionDetail');
|
|
expect(Generate.jsClassName('Session_Detail')).toBe('SessionDetail');
|
|
});
|
|
});
|
|
});
|