From 92e77b91416b86ec51f21c56ed4acfd079bebc80 Mon Sep 17 00:00:00 2001 From: Gwenhael Le Moine Date: Mon, 14 Jul 2014 19:41:37 +0200 Subject: [PATCH] Added angular skeleton, serve ti from sinatra --- Gemfile | 1 + Gemfile.lock | 2 + app.rb | 3 +- config.ru | 5 + public/.bowerrc | 3 + public/.gitignore | 7 + public/.jshintrc | 6 + public/.travis.yml | 14 + public/LICENSE | 22 ++ public/README.md | 292 ++++++++++++++++++ public/app/css/.gitkeep | 0 public/app/css/app.css | 29 ++ public/app/img/.gitkeep | 0 public/app/index.html | 52 ++++ public/app/js/app.js | 1 + public/app/js/core/controllers/AppCtrl.js | 3 + public/app/js/core/controllers/NavbarCtrl.js | 3 + .../js/core/directives/VersionDirective.js | 5 + public/app/js/core/filters/VersionFilter.js | 5 + public/app/js/core/services/VersionService.js | 1 + public/app/js/core/state.js | 27 ++ public/app/js/core/templates/404.tpl.html | 1 + public/app/js/core/templates/main.tpl.html | 6 + public/app/js/core/templates/navbar.tpl.html | 11 + public/app/js/main/controllers/AboutCtrl.js | 3 + public/app/js/main/controllers/ContactCtrl.js | 3 + public/app/js/main/controllers/HomeCtrl.js | 3 + public/app/js/main/state.js | 21 ++ public/app/js/main/templates/about.tpl.html | 1 + public/app/js/main/templates/contact.tpl.html | 1 + public/app/js/main/templates/home.tpl.html | 1 + public/bower.json | 14 + public/package.json | 34 ++ public/test/e2e/scenarios.js | 42 +++ public/test/karma.conf.js | 33 ++ public/test/protractor-conf.js | 19 ++ public/test/unit/controllersSpec.js | 20 ++ public/test/unit/directivesSpec.js | 19 ++ public/test/unit/filtersSpec.js | 19 ++ public/test/unit/servicesSpec.js | 13 + 40 files changed, 743 insertions(+), 2 deletions(-) create mode 100644 public/.bowerrc create mode 100644 public/.gitignore create mode 100644 public/.jshintrc create mode 100644 public/.travis.yml create mode 100644 public/LICENSE create mode 100644 public/README.md create mode 100644 public/app/css/.gitkeep create mode 100644 public/app/css/app.css create mode 100644 public/app/img/.gitkeep create mode 100644 public/app/index.html create mode 100644 public/app/js/app.js create mode 100644 public/app/js/core/controllers/AppCtrl.js create mode 100644 public/app/js/core/controllers/NavbarCtrl.js create mode 100644 public/app/js/core/directives/VersionDirective.js create mode 100644 public/app/js/core/filters/VersionFilter.js create mode 100644 public/app/js/core/services/VersionService.js create mode 100644 public/app/js/core/state.js create mode 100644 public/app/js/core/templates/404.tpl.html create mode 100644 public/app/js/core/templates/main.tpl.html create mode 100644 public/app/js/core/templates/navbar.tpl.html create mode 100644 public/app/js/main/controllers/AboutCtrl.js create mode 100644 public/app/js/main/controllers/ContactCtrl.js create mode 100644 public/app/js/main/controllers/HomeCtrl.js create mode 100644 public/app/js/main/state.js create mode 100644 public/app/js/main/templates/about.tpl.html create mode 100644 public/app/js/main/templates/contact.tpl.html create mode 100644 public/app/js/main/templates/home.tpl.html create mode 100644 public/bower.json create mode 100644 public/package.json create mode 100644 public/test/e2e/scenarios.js create mode 100644 public/test/karma.conf.js create mode 100644 public/test/protractor-conf.js create mode 100644 public/test/unit/controllersSpec.js create mode 100644 public/test/unit/directivesSpec.js create mode 100644 public/test/unit/filtersSpec.js create mode 100644 public/test/unit/servicesSpec.js diff --git a/Gemfile b/Gemfile index 4aec6d77..0dc3e37e 100644 --- a/Gemfile +++ b/Gemfile @@ -2,5 +2,6 @@ source 'https://rubygems.org' +gem 'rack-rewrite' gem 'sinatra' gem 'sinatra-param' diff --git a/Gemfile.lock b/Gemfile.lock index f7c23855..8eff4a50 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -4,6 +4,7 @@ GEM rack (1.5.2) rack-protection (1.5.3) rack + rack-rewrite (1.5.0) sinatra (1.4.5) rack (~> 1.4) rack-protection (~> 1.4) @@ -16,5 +17,6 @@ PLATFORMS ruby DEPENDENCIES + rack-rewrite sinatra sinatra-param diff --git a/app.rb b/app.rb index b9b915be..dc3380e3 100644 --- a/app.rb +++ b/app.rb @@ -11,7 +11,7 @@ class LedgerRbApp < Sinatra::Base helpers Sinatra::Param get '/' do - 'OH HAI!' + send_file 'public/app/index.html' end get '/api/ledger/accounts/?' do @@ -42,5 +42,4 @@ class LedgerRbApp < Sinatra::Base Ledger.version end - end diff --git a/config.ru b/config.ru index b4ae79a9..f2f4f899 100644 --- a/config.ru +++ b/config.ru @@ -6,4 +6,9 @@ configure :development do Sinatra::Application.reset! use Rack::Reloader end + +use Rack::Rewrite do + rewrite %r{^(/.*(css|js|ttf|woff|html|png|jpg|jpeg|gif)$)}, '/app/$1' +end + run LedgerRbApp diff --git a/public/.bowerrc b/public/.bowerrc new file mode 100644 index 00000000..8c58c8ef --- /dev/null +++ b/public/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "app/bower_components" +} \ No newline at end of file diff --git a/public/.gitignore b/public/.gitignore new file mode 100644 index 00000000..b702acc6 --- /dev/null +++ b/public/.gitignore @@ -0,0 +1,7 @@ +logs/* +!.gitkeep +node_modules/ +bower_components/ +tmp +.DS_Store +.idea \ No newline at end of file diff --git a/public/.jshintrc b/public/.jshintrc new file mode 100644 index 00000000..da408042 --- /dev/null +++ b/public/.jshintrc @@ -0,0 +1,6 @@ +{ + "globalstrict": true, + "globals": { + "angular": false + } +} \ No newline at end of file diff --git a/public/.travis.yml b/public/.travis.yml new file mode 100644 index 00000000..a368e661 --- /dev/null +++ b/public/.travis.yml @@ -0,0 +1,14 @@ +language: node_js +node_js: + - 0.10 + +before_script: + - export DISPLAY=:99.0 + - sh -e /etc/init.d/xvfb start + - npm start > /dev/null & + - npm run update-webdriver + - sleep 1 # give server time to start + +script: + - node_modules/.bin/karma start test/karma.conf.js --no-auto-watch --single-run --reporters=dots --browsers=Firefox + - node_modules/.bin/protractor test/protractor-conf.js --browser=firefox diff --git a/public/LICENSE b/public/LICENSE new file mode 100644 index 00000000..9ced3319 --- /dev/null +++ b/public/LICENSE @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2010-2014 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/public/README.md b/public/README.md new file mode 100644 index 00000000..ccf4794a --- /dev/null +++ b/public/README.md @@ -0,0 +1,292 @@ +# angular-ui-seed — the seed for AngularJS apps + +This project seed is an application skeleton for a typical [AngularJS](http://angularjs.org/) web app. +You can use it to quickly bootstrap your angular webapp projects and dev environment for these +projects. It uses angular [ui-router](https://github.com/angular-ui/ui-router) to create multiple named views as well as nested views. + +The seed contains a sample AngularJS application and is preconfigured to install the Angular +framework and a bunch of development and testing tools for instant web development gratification. + +The seed app doesn't do much, just shows how to wire two controllers and views together. + + +## Getting Started + +To get you started you can simply clone the angular-ui-seed repository and install the dependencies: + +### Prerequisites + +You need git to clone the angular-ui-seed repository. You can get it from +[http://git-scm.com/](http://git-scm.com/). + +We also use a number of node.js tools to initialize and test angular-ui-seed. You must have node.js and +its package manager (npm) installed. You can get them from [http://nodejs.org/](http://nodejs.org/). + +### Clone angular-ui-seed + +Clone the angular-ui-seed repository using [git][git]: + +``` +git clone https://github.com/dokko1230/angular-ui-seed.git +cd angular-ui-seed +``` + +### Install Dependencies + +We have two kinds of dependencies in this project: tools and angular framework code. The tools help +us manage and test the application. + +* We get the tools we depend upon via `npm`, the [node package manager][npm]. +* We get the angular code via `bower`, a [client-side code package manager][bower]. + +We have preconfigured `npm` to automatically run `bower` so we can simply do: + +``` +npm install +``` + +Behind the scenes this will also call `bower install`. You should find that you have two new +folders in your project. + +* `node_modules` - contains the npm packages for the tools we need +* `app/bower_components` - contains the angular framework files + +*Note that the `bower_components` folder would normally be installed in the root folder but +angular-ui-seed changes this location through the `.bowerrc` file. Putting it in the app folder makes +it easier to serve the files by a webserver.* + +### Run the Application + +We have preconfigured the project with a simple development web server. The simplest way to start +this server is: + +``` +npm start +``` + +Now browse to the app at `http://localhost:8000/app/index.html`. + + + +## Directory Layout + + app/ --> all of the files to be used in production + css/ --> css files + app.css --> default stylesheet + img/ --> image files + index.html --> app layout file (the main html template file of the app) + js/ --> javascript files + core/ --> core files + controllers/ --> core controllers + AppCtrl.js + NavbarCtrl.js + directives/ --> core directives + VersionDirective.js + filters/ --> core filters + VersionFilter.js + services/ --> core services + VersionService.js + templates/ --> core templates + 404.tpl.html + main.tpl.html + navbar.tpl.html + state.js --> core state + main/ --> main files + controllers/ --> main controllers + AboutCtrl.js + ContactCtrl.js + HomeCtrl.js + templates/ --> main templates + home.tpl.html + about.tpl.html + contact.tpl.html + state.js --> main state + + app.js --> application + + test/ --> test config and source files + protractor-conf.js --> config file for running e2e tests with Protractor + e2e/ --> end-to-end specs + scenarios.js + karma.conf.js --> config file for running unit tests with Karma + unit/ --> unit level specs/tests + controllersSpec.js --> specs for controllers + directivessSpec.js --> specs for directives + filtersSpec.js --> specs for filters + servicesSpec.js --> specs for services + + +## Testing + +There are two kinds of tests in the angular-ui-seed application: Unit tests and End to End tests. + +### Running Unit Tests + +The angular-ui-seed app comes preconfigured with unit tests. These are written in +[Jasmine][jasmine], which we run with the [Karma Test Runner][karma]. We provide a Karma +configuration file to run them. + +* the configuration is found at `test/karma.conf.js` +* the unit tests are found in `test/unit/`. + +The easiest way to run the unit tests is to use the supplied npm script: + +``` +npm test +``` + +This script will start the Karma test runner to execute the unit tests. Moreover, Karma will sit and +watch the source and test files for changes and then re-run the tests whenever any of them change. +This is the recommended strategy; if your unit tests are being run every time you save a file then +you receive instant feedback on any changes that break the expected code functionality. + +You can also ask Karma to do a single run of the tests and then exit. This is useful if you want to +check that a particular version of the code is operating as expected. The project contains a +predefined script to do this: + +``` +npm run test-single-run +``` + + +### End to end testing + +The angular-ui-seed app comes with end-to-end tests, again written in [Jasmine][jasmine]. These tests +are run with the [Protractor][protractor] End-to-End test runner. It uses native events and has +special features for Angular applications. + +* the configuration is found at `test/protractor-conf.js` +* the end-to-end tests are found in `test/e2e/` + +Protractor simulates interaction with our web app and verifies that the application responds +correctly. Therefore, our web server needs to be serving up the application, so that Protractor +can interact with it. + +``` +npm start +``` + +In addition, since Protractor is built upon WebDriver we need to install this. The angular-ui-seed +project comes with a predefined script to do this: + +``` +npm run update-webdriver +``` + +This will download and install the latest version of the stand-alone WebDriver tool. + +Once you have ensured that the development web server hosting our application is up and running +and WebDriver is updated, you can run the end-to-end tests using the supplied npm script: + +``` +npm run protractor +``` + +This script will execute the end-to-end tests against the application being hosted on the +development server. + + +## Updating Angular + +Previously we recommended that you merge in changes to angular-ui-seed into your own fork of the project. +Now that the angular framework library code and tools are acquired through package managers (npm and +bower) you can use these tools instead to update the dependencies. + +You can update the tool dependencies by running: + +``` +npm update +``` + +This will find the latest versions that match the version ranges specified in the `package.json` file. + +You can update the Angular dependencies by running: + +``` +bower update +``` + +This will find the latest versions that match the version ranges specified in the `bower.json` file. + + +## Serving the Application Files + +While angular is client-side-only technology and it's possible to create angular webapps that +don't require a backend server at all, we recommend serving the project files using a local +webserver during development to avoid issues with security restrictions (sandbox) in browsers. The +sandbox implementation varies between browsers, but quite often prevents things like cookies, xhr, +etc to function properly when an html page is opened via `file://` scheme instead of `http://`. + + +### Running the App during Development + +The angular-ui-seed project comes preconfigured with a local development webserver. It is a node.js +tool called [http-server][http-server]. You can start this webserver with `npm start` but you may choose to +install the tool globally: + +``` +sudo npm install -g http-server +``` + +Then you can start your own development web server to serve static files from a folder by +running: + +``` +http-server +``` + +Alternatively, you can choose to configure your own webserver, such as apache or nginx. Just +configure your server to serve the files under the `app/` directory. + + +### Running the App in Production + +This really depends on how complex is your app and the overall infrastructure of your system, but +the general rule is that all you need in production are all the files under the `app/` directory. +Everything else should be omitted. + +Angular apps are really just a bunch of static html, css and js files that just need to be hosted +somewhere they can be accessed by browsers. + +If your Angular app is talking to the backend server via xhr or other means, you need to figure +out what is the best way to host the static files to comply with the same origin policy if +applicable. Usually this is done by hosting the files by the backend server or through +reverse-proxying the backend server(s) and webserver(s). + + +## Continuous Integration + +### Travis CI + +[Travis CI][travis] is a continuous integration service, which can monitor GitHub for new commits +to your repository and execute scripts such as building the app or running tests. The angular-ui-seed +project contains a Travis configuration file, `.travis.yml`, which will cause Travis to run your +tests when you push to GitHub. + +You will need to enable the integration between Travis and GitHub. See the Travis website for more +instruction on how to do this. + +### CloudBees + +CloudBees have provided a CI/deployment setup: + + + + +If you run this, you will get a cloned version of this repo to start working on in a private git repo, +along with a CI service (in Jenkins) hosted that will run unit and end to end tests in both Firefox and Chrome. + + +## Contact + +For more information on AngularJS please check out http://angularjs.org/ + +[git]: http://git-scm.com/ +[bower]: http://bower.io +[npm]: https://www.npmjs.org/ +[node]: http://nodejs.org +[protractor]: https://github.com/angular/protractor +[jasmine]: http://pivotal.github.com/jasmine/ +[karma]: http://karma-runner.github.io +[travis]: https://travis-ci.org/ +[http-server]: https://github.com/nodeapps/http-server diff --git a/public/app/css/.gitkeep b/public/app/css/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/public/app/css/app.css b/public/app/css/app.css new file mode 100644 index 00000000..16d65505 --- /dev/null +++ b/public/app/css/app.css @@ -0,0 +1,29 @@ +/* app css stylesheet */ + +body { + margin: 0; + padding: 0; +} + +.container { + width: 960px; + margin: 0 auto; +} + +.main { + clear:both; +} + +.nav { + list-style-type: none; + padding: 0; +} + +.nav li { + float: left; + margin-right: 10px; +} + +.nav:after { + clear:both; +} \ No newline at end of file diff --git a/public/app/img/.gitkeep b/public/app/img/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/public/app/index.html b/public/app/index.html new file mode 100644 index 00000000..592ae523 --- /dev/null +++ b/public/app/index.html @@ -0,0 +1,52 @@ + + + + + + + + + My AngularJS App + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/app/js/app.js b/public/app/js/app.js new file mode 100644 index 00000000..fba25d03 --- /dev/null +++ b/public/app/js/app.js @@ -0,0 +1 @@ +var app = angular.module('app', ['ui.router']); diff --git a/public/app/js/core/controllers/AppCtrl.js b/public/app/js/core/controllers/AppCtrl.js new file mode 100644 index 00000000..de8e0da4 --- /dev/null +++ b/public/app/js/core/controllers/AppCtrl.js @@ -0,0 +1,3 @@ +app.controller('AppCtrl', function($scope) { + +}); diff --git a/public/app/js/core/controllers/NavbarCtrl.js b/public/app/js/core/controllers/NavbarCtrl.js new file mode 100644 index 00000000..84e48ba8 --- /dev/null +++ b/public/app/js/core/controllers/NavbarCtrl.js @@ -0,0 +1,3 @@ +app.controller('NavbarCtrl', function($scope) { + $scope.items = ['Home', 'About', 'Contact']; +}); diff --git a/public/app/js/core/directives/VersionDirective.js b/public/app/js/core/directives/VersionDirective.js new file mode 100644 index 00000000..8161b627 --- /dev/null +++ b/public/app/js/core/directives/VersionDirective.js @@ -0,0 +1,5 @@ +app.directive('appVersion', ['version', function(version) { + return function(scope, elm, attrs) { + elm.text(version); + }; +}]); \ No newline at end of file diff --git a/public/app/js/core/filters/VersionFilter.js b/public/app/js/core/filters/VersionFilter.js new file mode 100644 index 00000000..c3524f91 --- /dev/null +++ b/public/app/js/core/filters/VersionFilter.js @@ -0,0 +1,5 @@ +app.filter('interpolate', ['version', function(version) { + return function(text) { + return String(text).replace(/\%VERSION\%/mg, version); + }; +}]); \ No newline at end of file diff --git a/public/app/js/core/services/VersionService.js b/public/app/js/core/services/VersionService.js new file mode 100644 index 00000000..2049cfcf --- /dev/null +++ b/public/app/js/core/services/VersionService.js @@ -0,0 +1 @@ +app.value('version', '0.1'); \ No newline at end of file diff --git a/public/app/js/core/state.js b/public/app/js/core/state.js new file mode 100644 index 00000000..8c259895 --- /dev/null +++ b/public/app/js/core/state.js @@ -0,0 +1,27 @@ +// Application Level State +app.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) { + + $urlRouterProvider.when('', '/home'); + + + $stateProvider + .state('app', { + url: '', + controller: 'AppCtrl', + views: { + 'navbar': { + templateUrl: 'js/core/templates/navbar.tpl.html', + controller: 'NavbarCtrl' + }, + 'main': { + templateUrl: 'js/core/templates/main.tpl.html' + } + } + }) + .state('404', { + url: '/404', + templateUrl: 'js/core/templates/404.tpl.html', + controller: 'AppCtrl' + }); + +}]); \ No newline at end of file diff --git a/public/app/js/core/templates/404.tpl.html b/public/app/js/core/templates/404.tpl.html new file mode 100644 index 00000000..02b5ff22 --- /dev/null +++ b/public/app/js/core/templates/404.tpl.html @@ -0,0 +1 @@ +
404 Error
\ No newline at end of file diff --git a/public/app/js/core/templates/main.tpl.html b/public/app/js/core/templates/main.tpl.html new file mode 100644 index 00000000..9b00b9aa --- /dev/null +++ b/public/app/js/core/templates/main.tpl.html @@ -0,0 +1,6 @@ + +
+
+
+
+
diff --git a/public/app/js/core/templates/navbar.tpl.html b/public/app/js/core/templates/navbar.tpl.html new file mode 100644 index 00000000..c1758c61 --- /dev/null +++ b/public/app/js/core/templates/navbar.tpl.html @@ -0,0 +1,11 @@ + +
+
+ + +
+
diff --git a/public/app/js/main/controllers/AboutCtrl.js b/public/app/js/main/controllers/AboutCtrl.js new file mode 100644 index 00000000..e7ce2297 --- /dev/null +++ b/public/app/js/main/controllers/AboutCtrl.js @@ -0,0 +1,3 @@ +app.controller('AboutCtrl', ['$scope', function($scope) { + +}]); \ No newline at end of file diff --git a/public/app/js/main/controllers/ContactCtrl.js b/public/app/js/main/controllers/ContactCtrl.js new file mode 100644 index 00000000..1a54b6ac --- /dev/null +++ b/public/app/js/main/controllers/ContactCtrl.js @@ -0,0 +1,3 @@ +app.controller('ContactCtrl', ['$scope', function($scope) { + +}]); \ No newline at end of file diff --git a/public/app/js/main/controllers/HomeCtrl.js b/public/app/js/main/controllers/HomeCtrl.js new file mode 100644 index 00000000..b9e19882 --- /dev/null +++ b/public/app/js/main/controllers/HomeCtrl.js @@ -0,0 +1,3 @@ +app.controller('HomeCtrl', ['$scope', function($scope) { + +}]); \ No newline at end of file diff --git a/public/app/js/main/state.js b/public/app/js/main/state.js new file mode 100644 index 00000000..dbe836a8 --- /dev/null +++ b/public/app/js/main/state.js @@ -0,0 +1,21 @@ +// Sub-application/main Level State +app.config(['$stateProvider', function($stateProvider) { + + $stateProvider + .state('app.home', { + url: '/home', + templateUrl: 'js/main/templates/home.tpl.html', + controller: 'HomeCtrl' + }) + .state('app.about', { + url: '/about', + templateUrl: 'js/main/templates/about.tpl.html', + controller: 'AboutCtrl' + }) + .state('app.contact', { + url: '/contact', + templateUrl: 'js/main/templates/contact.tpl.html', + controller: 'ContactCtrl' + }); + +}]); \ No newline at end of file diff --git a/public/app/js/main/templates/about.tpl.html b/public/app/js/main/templates/about.tpl.html new file mode 100644 index 00000000..79bc40da --- /dev/null +++ b/public/app/js/main/templates/about.tpl.html @@ -0,0 +1 @@ +

This is about

\ No newline at end of file diff --git a/public/app/js/main/templates/contact.tpl.html b/public/app/js/main/templates/contact.tpl.html new file mode 100644 index 00000000..7e853f26 --- /dev/null +++ b/public/app/js/main/templates/contact.tpl.html @@ -0,0 +1 @@ +

This is contact

\ No newline at end of file diff --git a/public/app/js/main/templates/home.tpl.html b/public/app/js/main/templates/home.tpl.html new file mode 100644 index 00000000..7731373b --- /dev/null +++ b/public/app/js/main/templates/home.tpl.html @@ -0,0 +1 @@ +

This is home

\ No newline at end of file diff --git a/public/bower.json b/public/bower.json new file mode 100644 index 00000000..8ccb73c0 --- /dev/null +++ b/public/bower.json @@ -0,0 +1,14 @@ +{ + "name": "angular-ui-seed", + "description": "A starter project for AngularJS", + "version": "0.0.2", + "homepage": "https://github.com/dokko1230/angular-ui-seed", + "license": "MIT", + "dependencies": { + "angular": "latest", + "angular-ui-router": "~0.2.10", + "angular-loader": "1.2.x", + "angular-mocks": "~1.2.x", + "html5-boilerplate": "~4.3.0" + } +} diff --git a/public/package.json b/public/package.json new file mode 100644 index 00000000..1ca0b7e3 --- /dev/null +++ b/public/package.json @@ -0,0 +1,34 @@ +{ + "name": "angular-ui-seed", + "private": true, + "version": "0.0.0", + "description": "A starter project for AngularJS", + "repository": "https://github.com/dokko1230/angular-ui-seed", + "license": "MIT", + "devDependencies": { + "karma": "~0.10", + "protractor": "~0.20.1", + "http-server": "^0.6.1", + "bower": "^1.3.1", + "shelljs": "^0.2.6", + "karma-junit-reporter": "^0.2.2" + }, + "scripts": { + "postinstall": "bower install", + + "prestart": "npm install", + "start": "http-server -a localhost -p 8000", + + "pretest": "npm install", + "test": "karma start test/karma.conf.js", + "test-single-run": "karma start test/karma.conf.js --single-run", + + "preupdate-webdriver": "npm install", + "update-webdriver": "webdriver-manager update", + + "preprotractor": "npm run update-webdriver", + "protractor": "protractor test/protractor-conf.js", + + "update-index-async": "node -e \"require('shelljs/global'); sed('-i', /\\/\\/@@NG_LOADER_START@@[\\s\\S]*\\/\\/@@NG_LOADER_END@@/, '//@@NG_LOADER_START@@\\n' + cat('app/bower_components/angular-loader/angular-loader.min.js') + '\\n//@@NG_LOADER_END@@', 'app/index-async.html');\"" + } +} diff --git a/public/test/e2e/scenarios.js b/public/test/e2e/scenarios.js new file mode 100644 index 00000000..4421663a --- /dev/null +++ b/public/test/e2e/scenarios.js @@ -0,0 +1,42 @@ +'use strict'; + +/* https://github.com/angular/protractor/blob/master/docs/getting-started.md */ + +describe('my app', function() { + + browser.get('index.html'); + + it('should automatically redirect to /home when location hash/fragment is empty', function() { + expect(browser.getLocationAbsUrl()).toMatch("/home"); + }); + + + describe('home', function() { + + beforeEach(function() { + browser.get('index.html#/home'); + }); + + + it('should render home when user navigates to /home', function() { + expect(element.all(by.css('[ui-view] p')).first().getText()). + toMatch(/This is home/); + }); + + }); + + + describe('about', function() { + + beforeEach(function() { + browser.get('index.html#/about'); + }); + + + it('should render about when user navigates to /about', function() { + expect(element.all(by.css('[ui-view] p')).first().getText()). + toMatch(/This is about/); + }); + + }); +}); diff --git a/public/test/karma.conf.js b/public/test/karma.conf.js new file mode 100644 index 00000000..8ed9e874 --- /dev/null +++ b/public/test/karma.conf.js @@ -0,0 +1,33 @@ +module.exports = function(config){ + config.set({ + + basePath : '../', + + files : [ + 'app/bower_components/angular/angular.js', + 'app/bower_components/angular-ui-router/release/angular-ui-router.js', + 'app/bower_components/angular-mocks/angular-mocks.js', + 'app/js/**/*.js', + 'test/unit/**/*.js' + ], + + autoWatch : true, + + frameworks: ['jasmine'], + + browsers : ['Chrome'], + + plugins : [ + 'karma-chrome-launcher', + 'karma-firefox-launcher', + 'karma-jasmine', + 'karma-junit-reporter' + ], + + junitReporter : { + outputFile: 'test_out/unit.xml', + suite: 'unit' + } + + }); +}; diff --git a/public/test/protractor-conf.js b/public/test/protractor-conf.js new file mode 100644 index 00000000..7720db5f --- /dev/null +++ b/public/test/protractor-conf.js @@ -0,0 +1,19 @@ +exports.config = { + allScriptsTimeout: 11000, + + specs: [ + 'e2e/*.js' + ], + + capabilities: { + 'browserName': 'chrome' + }, + + baseUrl: 'http://localhost:8000/app/', + + framework: 'jasmine', + + jasmineNodeOpts: { + defaultTimeoutInterval: 30000 + } +}; diff --git a/public/test/unit/controllersSpec.js b/public/test/unit/controllersSpec.js new file mode 100644 index 00000000..a03b9663 --- /dev/null +++ b/public/test/unit/controllersSpec.js @@ -0,0 +1,20 @@ +'use strict'; + +/* jasmine specs for controllers go here */ + +describe('controllers', function(){ + beforeEach(module('app')); + + + it('should ....', inject(function($controller) { + //spec body + var AppCtrl = $controller('AppCtrl', { $scope: {} }); + expect(AppCtrl).toBeDefined(); + })); + + it('should ....', inject(function($controller) { + //spec body + var HomeCtrl = $controller('HomeCtrl', { $scope: {} }); + expect(HomeCtrl).toBeDefined(); + })); +}); diff --git a/public/test/unit/directivesSpec.js b/public/test/unit/directivesSpec.js new file mode 100644 index 00000000..2e03848c --- /dev/null +++ b/public/test/unit/directivesSpec.js @@ -0,0 +1,19 @@ +'use strict'; + +/* jasmine specs for directives go here */ + +describe('directives', function() { + beforeEach(module('app')); + + describe('app-version', function() { + it('should print current version', function() { + module(function($provide) { + $provide.value('version', 'TEST_VER'); + }); + inject(function($compile, $rootScope) { + var element = $compile('')($rootScope); + expect(element.text()).toEqual('TEST_VER'); + }); + }); + }); +}); diff --git a/public/test/unit/filtersSpec.js b/public/test/unit/filtersSpec.js new file mode 100644 index 00000000..ed5cfac1 --- /dev/null +++ b/public/test/unit/filtersSpec.js @@ -0,0 +1,19 @@ +'use strict'; + +/* jasmine specs for filters go here */ + +describe('filter', function() { + beforeEach(module('app')); + + + describe('interpolate', function() { + beforeEach(module(function($provide) { + $provide.value('version', 'TEST_VER'); + })); + + + it('should replace VERSION', inject(function(interpolateFilter) { + expect(interpolateFilter('before %VERSION% after')).toEqual('before TEST_VER after'); + })); + }); +}); diff --git a/public/test/unit/servicesSpec.js b/public/test/unit/servicesSpec.js new file mode 100644 index 00000000..98845394 --- /dev/null +++ b/public/test/unit/servicesSpec.js @@ -0,0 +1,13 @@ +'use strict'; + +/* jasmine specs for services go here */ + +describe('service', function() { + beforeEach(module('app')); + + describe('version', function() { + it('should return current version', inject(function(version) { + expect(version).toEqual('0.1'); + })); + }); +});