Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Richard - ToDo #150

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
bower_components
node_modules
11 changes: 11 additions & 0 deletions .jshintrc
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,15 @@

// Custom Globals
"globals" : { "toDoList": true, "angular": true } // additional predefined global variables

"predef": [
"protractor",
"browser",
"by",
"element",
"it",
"describe",
"beforeEach",
"afterEach"
]
}
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
sudo: required
script:
- npm test --single-run
- node_modules/.bin/protractor test/e2e/conf.js --browser=firefox
Expand Down
45 changes: 45 additions & 0 deletions Gruntfile.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
express: {
options: {
port:8080,
script: 'index.js'
},
run: {
}
},
karma: {
options: {
configFile: './test/karma.conf.js'
},
run: {
}
},
protractor: {
options: {
configFile: './test/e2e/conf.js'
},
run: {
}
},
protractor_webdriver: {
start: {
options: {
path: 'node_modules/protractor/bin/',
command: 'webdriver-manager start'
}
}
}
});

grunt.loadNpmTasks('grunt-express-server');
grunt.loadNpmTasks('grunt-karma');
grunt.loadNpmTasks('grunt-protractor-runner');
grunt.loadNpmTasks('grunt-protractor-webdriver');

grunt.registerTask('test', ['karma', 'e2e']);
grunt.registerTask('unit', ['karma']);
grunt.registerTask('e2e', ['express', 'protractor_webdriver', 'protractor']);

};
28 changes: 28 additions & 0 deletions bower.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"name": "todo_challenge",
"homepage": "https://github.com/ric9176/todo_challenge",
"authors": [
"Richard Moss <[email protected]>"
],
"description": "",
"main": "",
"moduleType": [],
"license": "MIT",
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"test",
"tests"
],
"dependencies": {
"jquery": "~2.2.0",
"bootstrap": "~3.3.6",
"angular": "~1.4.9",
"angular-resource": "~1.4.9"
},
"devDependencies": {
"angular-mocks": "~1.4.9",
"angular-route": "~1.4.9"
}
}
19 changes: 19 additions & 0 deletions css/main.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
.strike {
text-decoration: line-through;
}

input, p {
display: inline-block;
}

.taskList {
padding-top: 20px;
}

.container {
text-align:center;
}

.jumbotron {
text-align: center;
}
36 changes: 36 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<!doctype html>
<html lang="en" ng-app="ToDoList">
<head>
<meta charset="utf-8">
<title>To Do List</title>
<link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.css">
<script src="bower_components/jquery/dist/jquery.js"></script>
<script src="bower_components/angular/angular.js"></script>
<script src="bower_components/angular-resource/angular-resource.js"></script>
<link href="css/main.css" rel="stylesheet" />
<script src="js/app.js"></script>
<script src="js/toDoListController.js"></script>
</head>

<body ng-controller="ToDoListController as tdCtrl">
<div class="header">
<div class="jumbotron">
<h1> My List </h1>
<input type="text" ng-model="tdCtrl.task">
<button class="add btn btn-danger" ng-click="tdCtrl.addTask()">Add Task!</button>
<button class="clear btn btn-primary" ng-click="tdCtrl.clearCompleted()">Clear Done Tasks!</button>
</div>

<div class="container">
<div ng-repeat="task in tdCtrl.taskList" class="taskList">
<input type="checkbox" ng-model="deleted" ng-click="tdCtrl.taskDone($index)">
<p ng-class="{strike: deleted}">{{ task.taskName }}</p>
<button class="remove btn btn-warning btn-xs" ng-click="tdCtrl.deleteTask()">deleteTask!</button>
</div>
</div>
</div>



</body>
</html>
16 changes: 16 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
var express = require('express');
// var logger = require('morgan');
var app = express();

app.set('port', (process.env.PORT || 8080));

// app.use(logger('dev'));
app.use(express.static(__dirname));

app.get('/', function(request, responce) {
response.render('index.html');
});

app.listen(app.get('port'), function() {
console.log('Node app is running on port', app.get('port'));
});
1 change: 1 addition & 0 deletions js/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
var toDoList = angular.module('ToDoList', []);
34 changes: 34 additions & 0 deletions js/toDoListController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
toDoList.controller('ToDoListController', [function(){
var self = this;

self.taskList = [];

self.addTask = function(){

if(self.task === "") {
return null;
} else {
self.taskList.push({taskName: self.task, completed: false});
self.task = "";
}
};

self.taskDone = function(tasknumber){
self.taskList[tasknumber].completed = !self.taskList[tasknumber].completed;
};

self.deleteTask = function(tasknumber){
self.taskList.splice(tasknumber, 1);
};

self.clearCompleted = function() {

for (i = 0; i < self.taskList.length; i += 1) {
if(self.taskList[i].completed === true) {
self.taskList.splice(i, 1);
i-=1;
}
}
};

}]);
37 changes: 37 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
"name": "todo_challenge",
"version": "1.0.0",
"description": "* Deadline: submit completed pull request by 9am on Monday * You may use whatever level of JavaScript you feel comfortable with - pure JS, jQuery, Angular, or whatever weird and wonderful framework you want to try. Extra points for DogeScript",
"main": "index.js",
"directories": {
"doc": "docs"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/ric9176/todo_challenge.git"
},
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/ric9176/todo_challenge/issues"
},
"homepage": "https://github.com/ric9176/todo_challenge#readme",
"devDependencies": {
"grunt": "^0.4.5",
"jasmine-core": "^2.4.1",
"karma": "^0.13.19",
"karma-chrome-launcher": "^0.2.2",
"karma-jasmine": "^0.3.6",
"karma-phantomjs-launcher": "^1.0.0",
"phantomjs": "^2.1.3",
"protractor": "^3.0.0"
},
"dependencies": {
"express": "^4.13.4",
"http-server": "^0.8.5",
"selenium-standalone": "^4.8.0"
}
}
9 changes: 9 additions & 0 deletions test/e2e/conf.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
exports.config = {
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['toDoListFeature.js'],
multiCapabilities: [{
browserName: 'firefox'
}, {
browserName: 'chrome'
}]
};
51 changes: 51 additions & 0 deletions test/e2e/toDoListFeature.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
describe('To Do List', function() {

var taskField = element(by.model('tdCtrl.task'));
var taskButton = element(by.className('add'));
var taskList = element(by.className('taskList'));
var taskCheckBox = element.all(by.model('deleted')).first();
var taskRemove = element.all(by.className('remove')).first();
var ps = element.all(by.css('p'));

beforeEach(function() {
browser.get('http://localhost:8080');
});

it('has a title', function() {
expect(browser.getTitle()).toEqual('To Do List');
});

it('has an input box for new tasks and displays added tasks', function() {
taskField.sendKeys('learn angular');
taskButton.click();
expect(taskList.getText()).toEqual('learn angular deleteTask!');
});

it('marks completed tasks as done using a checkbox', function() {
taskField.sendKeys('learn angular');
taskButton.click();
taskCheckBox.click();
expect(ps.first().getAttribute('class')).toMatch(/strike/);

});

it('can delete tasks using the delete task button', function() {
taskField.sendKeys('learn angular');
taskButton.click();
taskField.sendKeys('learn not to hate protractor');
taskButton.click();
taskRemove.click();
expect(taskList.getText()).not.toContain('learn angular');
});

it('can clear the completed tasks from the list', function(){
taskField.sendKeys('learn angular');
taskButton.click();
taskField.sendKeys('learn not to hate protractor');
taskButton.click();
taskCheckBox.click();
taskRemove.click();
expect(taskList.getText()).not.toContain('learn angular');
});

});
68 changes: 68 additions & 0 deletions test/karma.conf.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// Karma configuration
// Generated on Thu Jan 28 2016 10:43:21 GMT+0000 (GMT)

module.exports = function(config) {
config.set({

// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: '../',


// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine'],


// list of files / patterns to load in the browser
files: [
'bower_components/angular/angular.js',
'bower_components/angular-route/angular-route.js',
'bower_components/angular-resource/angular-resource.js',
'bower_components/angular-mocks/angular-mocks.js',
'js/**/*.js',
'test/**/*.spec.js'
],


// list of files to exclude
exclude: [],


// preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {},


// test results reporter to use
// possible values: 'dots', 'progress'
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
reporters: ['progress'],


// web server port
port: 9876,


// enable / disable colors in the output (reporters and logs)
colors: true,


// level of logging
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
logLevel: config.LOG_INFO,


// enable / disable watching file and executing tests whenever any file changes
autoWatch: true,


// start these browsers
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
browsers: ['PhantomJS'],


// Continuous Integration mode
// if true, Karma captures browsers, runs the tests and exits
singleRun: false
});
};
Loading