From 02b17d0c15fd9297da5fe03a7a75e78f9de374b9 Mon Sep 17 00:00:00 2001 From: Nabil Boag Date: Sun, 10 Apr 2016 20:31:16 +0100 Subject: [PATCH 1/2] Add ability to pick protractor framework to allow cucumber as an e2e framework. --- CONTRIBUTING.md | 10 ++-- README.md | 1 + docs/assets/cucmber.png | Bin 0 -> 2420 bytes docs/assets/original/cucumber.png | Bin 0 -> 6204 bytes docs/usage.md | 1 + docs/user-guide.md | 8 ++- generators/app/files.json | 7 ++- generators/app/prompts.json | 21 +++++++ generators/app/src/mock-prompts.js | 10 +++- generators/app/src/preprocessors.js | 8 ++- generators/app/src/techs.js | 3 +- generators/app/techs.json | 6 ++ generators/app/templates/_package.json | 6 ++ ...protractor.conf.js => _protractor.conf.js} | 16 +++++- generators/app/templates/e2e/_main.spec.js | 54 ++++++++++++++++++ generators/app/templates/e2e/main.feature | 7 +++ generators/app/templates/e2e/main.spec.js | 21 ------- .../gulp/{e2e-tests.js => _e2e-tests.js} | 2 +- .../templates/src/assets/images/cucumber.png | Bin 0 -> 6204 bytes test/inception/test-inception.js | 5 +- test/node/test-preprocessors.js | 21 ++++--- test/node/test-techs.js | 3 +- 22 files changed, 163 insertions(+), 47 deletions(-) create mode 100644 docs/assets/cucmber.png create mode 100644 docs/assets/original/cucumber.png rename generators/app/templates/{protractor.conf.js => _protractor.conf.js} (62%) create mode 100644 generators/app/templates/e2e/_main.spec.js create mode 100644 generators/app/templates/e2e/main.feature delete mode 100644 generators/app/templates/e2e/main.spec.js rename generators/app/templates/gulp/{e2e-tests.js => _e2e-tests.js} (91%) create mode 100644 generators/app/templates/src/assets/images/cucumber.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 868db265..4e3543be 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,9 +25,9 @@ Because we create a generator you should be specific as possible in your request Before you submit your pull request consider the following guidelines: -**Test** +**Test** Please add unit tests for every new feature or bug fix and make sure all tests pass before submitting pull requests. Generator tests are written in [Mocha](http://mochajs.org). [Karma](http://karma-runner.github.io/0.12/index.html) and [Protractor](http://angular.github.io/protractor) are used to run unit tests and e2e tests on generated app. -* Run `./node_modules/mocha/bin/_mocha ./test/*.js` to execute all tests instead of `npm test`. Currently all protractor tests in (2) are excluded from `npm test` due to Travis issue. +* Run `./node_modules/mocha/bin/_mocha ./test/**/*.js` to execute all tests instead of `npm test`. Currently all protractor tests in (2) are excluded from `npm test` due to Travis issue. You will need to have the ruby sass gem installed to run the full suite of tests. * Add tests into (1) and (2) if there are changes in generated project's structure. * Feel free to create new test file for new generator features. @@ -39,13 +39,13 @@ Please add unit tests for every new feature or bug fix and make sure all tests p | (4) `test-import-gen.js` | Test generator directory. | (5) `test-utils.js` | Unit tests for utils.js. -**Style Guide** +**Style Guide** Please brief yourself on [Idiomatic.js](https://github.com/rwldrn/idiomatic.js) style guide with two space indent. -**Documentation** +**Documentation** Add documentation for every new feature, directory structure change. Feel free to send corrections or better docs! -**Branch** +**Branch** Must be one of the following: * feat: A new feature diff --git a/README.md b/README.md index 731f3fb2..11c7eccd 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ yo gulp-angular ![Logo](docs/assets/bower.png) ![Logo](docs/assets/webpack.png) ![Logo](docs/assets/karma.png) +![Logo](docs/assets/cucumber.png) ![Logo](docs/assets/istanbul.png) ![Logo](docs/assets/browsersync.png) ![Logo](docs/assets/jasmine.png) diff --git a/docs/assets/cucmber.png b/docs/assets/cucmber.png new file mode 100644 index 0000000000000000000000000000000000000000..9a58976ff302a46ec421613e8430db960ad06028 GIT binary patch literal 2420 zcmV-)35)iLP)_$Po>;M5>K3=J2R@Qjv%qQqz*jQSCX+WF}MFM5oR;v9{Ahqo$d* zX{NS`CQjNY^@vAEDr&?rgP=$V;t^3O3ZmRByDYHV-}m0*SogiRZ(-p-^BZ>eeeZkU z@B9Au!{m0m(I=*lk}wPjC*~0giK)cB#5lrAh=<%JT8T!Ygg8MI5w@W|(4AY?|2Y`L zm$}3X#FIpX&bZh?pRl8KLq&+j_D5h0RI)G50-QZiq$r|*pvk+sCZ0NIt1bqRI*WuS@tk$By= z8|jsyDJJ=PZx{c%5edwMMoWGB+bFzW%)RmU4Yri3?*%K z@-=A;A7i_LL`x#}WF5iv6;*h1;dTU>NyyPOFiuLWFF4fo#NeeMm=_*s~JbLj^nZM3;W0HyuKT&j_2}Z=mfD}FE`$Lq?*2iD26yQo68W;~U?(u0JM?Pmr9632_fmb!a<5K<>n+yvEpiI^pcK%l2bTHfn9I7Lnf=o7W_{i`_N*yeFnz zWJINth{(cX`1zY&WAbX~VcSVG*lLuB(EXnpCGr@tNYgtxnDe#OOSU1oQEM_PYfod# zg|}39T$~1a9cXd3dR(h>G~l(0t+EI6?S==-&y5nvRV5+pp`#ut(UXxm`B|hVG12Yj zLfdWv77Jb}T8$kv-act?+(Bt`IZuO0vBQB=w~P9(wNssz9?d~}8`G2r;0CP7cwQzEog$ME>L`eag^F|}C=6~vDw3)cK9(e0 zLnYCtUKx6-rJk0DMoVh4_2S!_GymzKP1K@$82A{egTkeS%lVWNZ$$JCw#cV5bOM9r z+j>MMYK9xjIBY)qDl$LMMUDNY*NDpYD+o4?Mq=#YiZzqQc+ChdcG((-&o1r8#F|eq zGi4E`L{5U8uC=JC6xSNg@Z>}i80#Yg4w&4hMxo=C%vVpQ(o zgF9Q~g_#TlH<6M!+kw_w(!8-z85kGyEzZLmczz028>@?**W9L%UY^*T|K>RlXmC*Iq#^F5VF7aFyly*>|%x6m2Bm% zv3;9niNvm|4^h@qp*q(iu@B(&=^J=*U4vY>msIK5#8;}fFgZ*Jk3(uivg+lc#&cMA zZawXWzQVzv*vg&kYEj~aVq1b(2W_IYUJjHjd!H#>1-rXj-I9fu)Hk=AdPIsDh=?DfB(#iI|LOxQV{@5T}imq zFrM;f;w4`-`@dBWQnp#=d~Gs@VX^R1USV^(yS9auBAqd z$L1No=jL?FEnqQM3^A677^gS}&A@oXNMUtY(^mRpO3;ArI+}SJnOKnU9j}q~_S^Ck zxSq@HRbJPhPkS2U(eXaDK4Mp9O|YhV{e0b4gMwQps3unFDaY!M zdyNTahMXq4D7}8=X50N~KIEw#pZbdd6VA~6_P9MG@TQ7waETOzC4kWPFKR!kg#o<@VHMT8|@-i~)F-lE>e$hsaB zDtV`83x9&V8=t`8>Oyhzmw3D&2aU~@Jeqi;M7D@_fWMtaAuF|Zz|&?pM|(XJ*Rcp; z7Hn^=l56!4%YgfodcRF_4mE}j!`3L1j7;=p*nLt%OorTG@~hJ*bv1o=;ob5YB9rJn zdtkTyPi}#RM0myk;q}5~HG`AEGn}=HH9<*145jVA8cbp+-FVT7kMaGk!mT8W*8VzQ zb&NO}^O%9}#^fKwzCgSmdBHDF7Fa3OYRV0Th>*34&5Wjq%=1Yj1O0u6_&$+FoE-%c zqL3Et`|6P((pR%QtaR(^Mu-Fp5r|Zw%;*indC$HF@+)QWR_jCnNr*yT{O3f8KR1~J z@Zfz)_dZE!fbSW`T;i>ic>i$K-y6*V+(}VIiFW*&A>Pm0R(iG8F_fD}qBR)q=lF8P z-YyR3q2>`FV)U&|gQAMlhD&0ki1?CAN(GvzsA525w7SlBl+xfm;><`qU?hl$Q?4aM m(@Ojc)Mxq?XJF+20t^7fp9te?q}Hwg0000-O!5yBA^s6NK*ts1uH?0{%Q7$*Mg1aU&R78Iz#t!^&z_k}}IuCelL++w%=YSCnC+GW)zbvp|d&>g^C^u(F<&Z|E

|VS5$_3uYW1d2^$sIXKz;ev(ldY`#T?H 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 a0RR8P>n`f{q2h@E0000` and ending with ``. diff --git a/generators/app/files.json b/generators/app/files.json index 90471df9..0ecc8734 100644 --- a/generators/app/files.json +++ b/generators/app/files.json @@ -4,14 +4,12 @@ ".editorconfig", "tsconfig.json", - "protractor.conf.js", "e2e/.eslintrc", - "e2e/main.spec.js", + "e2e/main.feature", "gulpfile.js", "gulp/.eslintrc", - "gulp/e2e-tests.js", "src/favicon.ico", "src/assets/images/yeoman.png" @@ -25,10 +23,13 @@ "typings.json", "karma.conf.js", + "protractor.conf.js", + "e2e/main.spec.js", "e2e/main.po.js", "gulp/conf.js", + "gulp/e2e-tests.js", "gulp/build.js", "gulp/inject.js", "gulp/markups.js", diff --git a/generators/app/prompts.json b/generators/app/prompts.json index 083098e8..d4af40bf 100644 --- a/generators/app/prompts.json +++ b/generators/app/prompts.json @@ -391,5 +391,26 @@ "name": "Handlebars (*.hbs)" } ] + }, + { + "type": "list", + "name": "protractorFramework", + "message": "Which Protractor test framework do you want?", + "choices": [ + { + "value": { + "key": "jasmine", + "extension": "js" + }, + "name": "None, Use the default protractor framework (Jasmine)." + }, + { + "value": { + "key": "cucumber", + "extension": "feature" + }, + "name": "Cucumber, a BDD testing framework that uses feature tests." + } + ] } ] diff --git a/generators/app/src/mock-prompts.js b/generators/app/src/mock-prompts.js index 6f2777b3..2d61251b 100644 --- a/generators/app/src/mock-prompts.js +++ b/generators/app/src/mock-prompts.js @@ -24,7 +24,8 @@ var questions = [ 'foundationComponents', 'cssPreprocessor', 'jsPreprocessor', - 'htmlPreprocessor' + 'htmlPreprocessor', + 'protractorFramework' ]; var model = {}; @@ -81,6 +82,10 @@ model.htmlPreprocessor.choices.forEach(function (choice) { model.htmlPreprocessor.values[choice.value.key] = choice.value; }); +model.protractorFramework.choices.forEach(function (choice) { + model.protractorFramework.values[choice.value.key] = choice.value; +}); + module.exports = { prompts: model, defaults: { @@ -94,6 +99,7 @@ module.exports = { foundationComponents: model.foundationComponents.values.noFoundationComponents, cssPreprocessor: model.cssPreprocessor.values['node-sass'], jsPreprocessor: model.jsPreprocessor.values.noJsPrepro, - htmlPreprocessor: model.htmlPreprocessor.values.noHtmlPrepro + htmlPreprocessor: model.htmlPreprocessor.values.noHtmlPrepro, + protractorFramework: model.protractorFramework.values.jasmine, } }; diff --git a/generators/app/src/preprocessors.js b/generators/app/src/preprocessors.js index 1d3c00a0..2854e8aa 100644 --- a/generators/app/src/preprocessors.js +++ b/generators/app/src/preprocessors.js @@ -20,7 +20,8 @@ module.exports = function (GulpAngularGenerator) { 'js', this.props.cssPreprocessor.extension, this.props.jsPreprocessor.extension, - this.props.htmlPreprocessor.extension + this.props.htmlPreprocessor.extension, + this.props.protractorFramework.extension ]; if (this.imageMin) { this.processedFileExtension = this.processedFileExtension.concat(['jpg', 'png', 'gif', 'svg']); @@ -75,6 +76,11 @@ module.exports = function (GulpAngularGenerator) { if (this.props.jsPreprocessor.key !== 'noJsPrepro') { rejectWithRegexp.call(this, /^(?!^e2e\/).*spec\.js/); } + + if (this.props.protractorFramework.key !== 'cucumber') { + rejectWithRegexp.call(this, /main\.feature/); + } + }; /** diff --git a/generators/app/src/techs.js b/generators/app/src/techs.js index c4573ab9..37f269ee 100644 --- a/generators/app/src/techs.js +++ b/generators/app/src/techs.js @@ -19,7 +19,8 @@ module.exports = function (GulpAngularGenerator) { this.props.foundationComponents.key, this.props.cssPreprocessor.key, this.props.jsPreprocessor.key, - this.props.htmlPreprocessor.key + this.props.htmlPreprocessor.key, + this.props.protractorFramework.key ]) .filter(_.isString) .filter(function (tech) { diff --git a/generators/app/techs.json b/generators/app/techs.json index 32545c28..5973bc95 100644 --- a/generators/app/techs.json +++ b/generators/app/techs.json @@ -157,5 +157,11 @@ "url": "http://handlebarsjs.com/", "description": "Handlebars provides the power necessary to let you build semantic templates effectively with no frustration.", "logo": "handlebars.png" + }, + "cucumber": { + "title": "Cucumber", + "url": "https://cucumber.io/", + "description": "Cucumber, the popular Behaviour-Driven Development tool, brought to your JavaScript stack.", + "logo": "cucumber.png" } } diff --git a/generators/app/templates/_package.json b/generators/app/templates/_package.json index bb08e5a8..18195d63 100644 --- a/generators/app/templates/_package.json +++ b/generators/app/templates/_package.json @@ -78,6 +78,12 @@ "wiredep": "~2.2.2", "karma": "~0.13.10", "karma-jasmine": "~0.3.6", +<% if (props.protractorFramework.key === 'cucumber') { -%> + "cucumber": "~0.10.2", + "protractor-cucumber-framework": "~0.5.0", + "chai": "~3.5.0", + "chai-as-promised": "~5.3.0", +<% } -%> <% if(props.jsPreprocessor.key === 'traceur') { -%> "karma-chrome-launcher": "~0.2.1", <% } else { -%> diff --git a/generators/app/templates/protractor.conf.js b/generators/app/templates/_protractor.conf.js similarity index 62% rename from generators/app/templates/protractor.conf.js rename to generators/app/templates/_protractor.conf.js index 862d068e..c2462c13 100644 --- a/generators/app/templates/protractor.conf.js +++ b/generators/app/templates/_protractor.conf.js @@ -17,11 +17,25 @@ exports.config = { // Spec patterns are relative to the current working directory when // protractor is called. - specs: [paths.e2e + '/**/*.js'], + specs: [paths.e2e + '/**/*.<%- props.protractorFramework.extension %>'], +<% if (props.protractorFramework.key === 'cucumber') { -%> + framework: 'custom', + // path relative to the current config file + frameworkPath: require.resolve('protractor-cucumber-framework'), + + // relevant cucumber command line options + cucumberOpts: { + require: [ + paths.e2e + '/**/*.js' + ], + format: "pretty" + } +<% } else { -%> // Options to be passed to Jasmine-node. jasmineNodeOpts: { showColors: true, defaultTimeoutInterval: 30000 } +<% } -%> }; diff --git a/generators/app/templates/e2e/_main.spec.js b/generators/app/templates/e2e/_main.spec.js new file mode 100644 index 00000000..264e9d90 --- /dev/null +++ b/generators/app/templates/e2e/_main.spec.js @@ -0,0 +1,54 @@ +'use strict'; + +<% if (props.protractorFramework.key === 'cucumber') { -%> +var chai = require('chai'); +var chaiAsPromised = require('chai-as-promised'); +var expect = chai.expect; +var page = require('./main.po'); + +chai.use(chaiAsPromised); + +module.exports = function () { + this.Given('a demo app', function (done) { + done(); + }); + + this.When('I load the page', function (done) { + browser.get('/index.html'); + done(); + }); + + this.Then(/^I should see the jumbotron with correct data$/, function (done) { + expect(page.h1El.getText()).to.eventually.equal('\'Allo, \'Allo!'); + expect(page.imgEl.getAttribute('src')).to.eventually.have.string('assets/images/yeoman.png'); + expect(page.imgEl.getAttribute('alt')).to.eventually.equal('I\'m Yeoman'); + done(); + }); + + this.Then(/^I should see a list of more than (\d+) awesome things$/, function (itemNumber, done) { + expect(page.thumbnailEls.count()).to.eventually.be.at.least(itemNumber); + done(); + }); +}; +<% } else { -%> +describe('The main view', function () { + var page; + + beforeEach(function () { + browser.get('/index.html'); + page = require('./main.po'); + }); + + it('should include jumbotron with correct data', function() { + expect(page.h1El.getText()).toBe('\'Allo, \'Allo!'); + expect(page.imgEl.getAttribute('src')).toMatch(/assets\/images\/yeoman.png$/); + expect(page.imgEl.getAttribute('alt')).toBe('I\'m Yeoman'); + }); + + it('should list more than 5 awesome things', function () { + expect(page.thumbnailEls.count()).toBeGreaterThan(5); + }); + +}); +<% } -%> + diff --git a/generators/app/templates/e2e/main.feature b/generators/app/templates/e2e/main.feature new file mode 100644 index 00000000..383e37eb --- /dev/null +++ b/generators/app/templates/e2e/main.feature @@ -0,0 +1,7 @@ +Feature: The project introduction page + + Scenario: The main view + Given a demo app + When I load the page + Then I should see the jumbotron with correct data + And I should see a list of more than 5 awesome things \ No newline at end of file diff --git a/generators/app/templates/e2e/main.spec.js b/generators/app/templates/e2e/main.spec.js deleted file mode 100644 index ef2e5c18..00000000 --- a/generators/app/templates/e2e/main.spec.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - -describe('The main view', function () { - var page; - - beforeEach(function () { - browser.get('/index.html'); - page = require('./main.po'); - }); - - it('should include jumbotron with correct data', function() { - expect(page.h1El.getText()).toBe('\'Allo, \'Allo!'); - expect(page.imgEl.getAttribute('src')).toMatch(/assets\/images\/yeoman.png$/); - expect(page.imgEl.getAttribute('alt')).toBe('I\'m Yeoman'); - }); - - it('should list more than 5 awesome things', function () { - expect(page.thumbnailEls.count()).toBeGreaterThan(5); - }); - -}); diff --git a/generators/app/templates/gulp/e2e-tests.js b/generators/app/templates/gulp/_e2e-tests.js similarity index 91% rename from generators/app/templates/gulp/e2e-tests.js rename to generators/app/templates/gulp/_e2e-tests.js index 3a66702a..06218002 100644 --- a/generators/app/templates/gulp/e2e-tests.js +++ b/generators/app/templates/gulp/_e2e-tests.js @@ -17,7 +17,7 @@ function runProtractor (done) { var params = process.argv; var args = params.length > 3 ? [params[3], params[4]] : []; - gulp.src(path.join(conf.paths.e2e, '/**/*.js')) + gulp.src(path.join(conf.paths.e2e, '/**/*.<%- props.protractorFramework.extension %>')) .pipe($.protractor.protractor({ configFile: 'protractor.conf.js', args: args diff --git a/generators/app/templates/src/assets/images/cucumber.png b/generators/app/templates/src/assets/images/cucumber.png new file mode 100644 index 0000000000000000000000000000000000000000..f8a386ede40fec9a25d5d98c527daac2a526f865 GIT binary patch literal 6204 zcmV-C7{lj@P)-O!5yBA^s6NK*ts1uH?0{%Q7$*Mg1aU&R78Iz#t!^&z_k}}IuCelL++w%=YSCnC+GW)zbvp|d&>g^C^u(F<&Z|E

|VS5$_3uYW1d2^$sIXKz;ev(ldY`#T?H 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 a0RR8P>n`f{q2h@E0000 Date: Wed, 20 Apr 2016 16:03:19 +0100 Subject: [PATCH 2/2] Use return value instead of callbacks. --- generators/app/templates/e2e/_main.spec.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/generators/app/templates/e2e/_main.spec.js b/generators/app/templates/e2e/_main.spec.js index 264e9d90..ee69df5b 100644 --- a/generators/app/templates/e2e/_main.spec.js +++ b/generators/app/templates/e2e/_main.spec.js @@ -18,16 +18,14 @@ module.exports = function () { done(); }); - this.Then(/^I should see the jumbotron with correct data$/, function (done) { + this.Then(/^I should see the jumbotron with correct data$/, function () { expect(page.h1El.getText()).to.eventually.equal('\'Allo, \'Allo!'); expect(page.imgEl.getAttribute('src')).to.eventually.have.string('assets/images/yeoman.png'); - expect(page.imgEl.getAttribute('alt')).to.eventually.equal('I\'m Yeoman'); - done(); + return expect(page.imgEl.getAttribute('alt')).to.eventually.equal('I\'m Yeoman'); }); - this.Then(/^I should see a list of more than (\d+) awesome things$/, function (itemNumber, done) { - expect(page.thumbnailEls.count()).to.eventually.be.at.least(itemNumber); - done(); + this.Then(/^I should see a list of more than (\d+) awesome things$/, function (itemNumber) { + return expect(page.thumbnailEls.count()).to.eventually.be.at.least(itemNumber); }); }; <% } else { -%>