Skip to content
This repository has been archived by the owner on Jan 3, 2019. It is now read-only.

Commit

Permalink
docs(todomvc): add todomvc example project
Browse files Browse the repository at this point in the history
  • Loading branch information
clebert committed Apr 22, 2018
1 parent e50b03b commit 59ab0d4
Show file tree
Hide file tree
Showing 31 changed files with 12,720 additions and 2 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
.DS_Store
coverage/
dist/
error-screenshot.png
lerna-debug.log
node_modules/
npm-debug.log
Expand Down
9 changes: 9 additions & 0 deletions @pageobject/todomvc/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# @pageobject/todomvc

> TODO.
---

Copyright (c) 2017-present, Clemens Akens. Released under the terms of the [MIT License][internal-license].

[internal-license]: https://github.com/clebert/pageobject/blob/master/LICENSE
9 changes: 9 additions & 0 deletions @pageobject/todomvc/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "@pageobject/todomvc",
"private": true,
"dependencies": {
"@pageobject/base": "^9.1.0",
"@pageobject/puppeteer": "^9.1.0",
"@pageobject/web": "^9.1.0"
}
}
5 changes: 5 additions & 0 deletions @pageobject/todomvc/src/Label.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import {WebComponent} from '@pageobject/web';

export class Label extends WebComponent {
public readonly selector: string = 'label';
}
5 changes: 5 additions & 0 deletions @pageobject/todomvc/src/NewTodoInput.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import {WebComponent} from '@pageobject/web';

export class NewTodoInput extends WebComponent {
public readonly selector: string = '.new-todo';
}
10 changes: 10 additions & 0 deletions @pageobject/todomvc/src/Todo.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import {WebComponent} from '@pageobject/web';
import {Label} from './Label';
import {Toggle} from './Toggle';

export class Todo extends WebComponent {
public readonly selector: string = 'li';

public readonly label = new Label(this.adapter, this);
public readonly toggle = new Toggle(this.adapter, this);
}
8 changes: 8 additions & 0 deletions @pageobject/todomvc/src/TodoList.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import {WebComponent} from '@pageobject/web';
import {Todo} from './Todo';

export class TodoList extends WebComponent {
public readonly selector: string = '.todo-list';

public readonly todos = new Todo(this.adapter, this);
}
38 changes: 38 additions & 0 deletions @pageobject/todomvc/src/TodoMVC.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import {Test, TestCallback} from '@pageobject/base';
import {PuppeteerAdapter} from '@pageobject/puppeteer';
import {WebComponent} from '@pageobject/web';
import {NewTodoInput} from './NewTodoInput';
import {TodoList} from './TodoList';

jasmine.DEFAULT_TIMEOUT_INTERVAL = 60 * 1000;

const args =
process.env.CI === 'true'
? ['--disable-dev-shm-usage', '--disable-setuid-sandbox', '--no-sandbox']
: [];

export class TodoMVC extends WebComponent {
public static jest(name: string, callback: TestCallback<TodoMVC>): void {
test(name, async () => {
const adapter = await PuppeteerAdapter.create(
{args},
{waitUntil: 'domcontentloaded'}
);

try {
await Test.run(new TodoMVC(adapter), 10, callback);
} catch (e) {
await adapter.page.screenshot({path: 'error-screenshot.png'});

throw e;
} finally {
await adapter.quit();
}
});
}

public readonly selector: string = '.todoapp';

public readonly newTodoInput = new NewTodoInput(this.adapter, this);
public readonly todoList = new TodoList(this.adapter, this);
}
13 changes: 13 additions & 0 deletions @pageobject/todomvc/src/Toggle.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import {Effect} from '@pageobject/base';
import {WebComponent} from '@pageobject/web';

export class Toggle extends WebComponent {
public readonly selector: string = '.toggle';

public isChecked(): Effect<boolean> {
return async () =>
(await this.findUniqueNode()).execute(
(element: HTMLInputElement) => element.checked
);
}
}
20 changes: 20 additions & 0 deletions @pageobject/todomvc/src/tests/completing-a-todo.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import {Predicate} from '@pageobject/base';
import {TodoMVC} from '../TodoMVC';

const {is} = Predicate;

TodoMVC.jest('Completing a todo', (test, app) => {
test.perform(app.page.goto('http://todomvc.com/examples/react/#/'), 30);

test
.assert(app.newTodoInput.hasFocus(), is(true))
.perform(app.keyboard.type('My todo'))
.perform(app.keyboard.press('Enter'));

const todo = app.todoList.todos.first();

test
.assert(todo.toggle.isChecked(), is(false))
.perform(todo.toggle.click())
.assert(todo.toggle.isChecked(), is(true));
});
20 changes: 20 additions & 0 deletions @pageobject/todomvc/src/tests/creating-todos.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import {Predicate} from '@pageobject/base';
import {TodoMVC} from '../TodoMVC';

const {is} = Predicate;

TodoMVC.jest('Creating todos', (test, app) => {
test.perform(app.page.goto('http://todomvc.com/examples/react/#/'), 30);

test
.assert(app.newTodoInput.hasFocus(), is(true))
.perform(app.keyboard.type('My first todo'))
.perform(app.keyboard.press('Enter'))

.assert(app.newTodoInput.hasFocus(), is(true))
.perform(app.keyboard.type('My second todo'))
.perform(app.keyboard.press('Enter'))

.assert(app.todoList.todos.first().label.getText(), is('My first todo'))
.assert(app.todoList.todos.last().label.getText(), is('My second todo'));
});
8 changes: 8 additions & 0 deletions @pageobject/todomvc/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "dist",
"rootDir": "src"
},
"include": ["src/**/*.ts", "types/**/*.d.ts"]
}
3 changes: 3 additions & 0 deletions @pageobject/todomvc/tslint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": "../../tslint.json"
}
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
BIN := "$(shell yarn bin)"
PKGS := base web protractor puppeteer selenium-webdriver
PKGS := base web protractor puppeteer selenium-webdriver todomvc

.PHONY: docs
docs: $(addprefix docs/api/,$(PKGS)) docs/index.md
Expand Down
Loading

0 comments on commit 59ab0d4

Please sign in to comment.