--- /dev/null
+/* newslash-test-helper - newslash test helper */
+const assert = require("assert").strict;
+const puptest = require("./puptest");
+
+let page;
+
+exports.init = function init() {
+ exports.username = process.env.TEST_USER;
+ exports.password = process.env.TEST_PASSWORD;
+ exports.baseUrl = process.env.TEST_HOST; // "https://newslash-dev:3000";
+
+ assert.ok(exports.username.length > 0, "username.length > 0");
+ assert.ok(exports.password.length > 0, "password.length > 0");
+ assert.ok(exports.baseUrl.length > 0, "baseUrl.length > 0");
+
+ return puptest.newPage().then(p => {
+ page = p;
+ p.on('pageerror', err => {
+ console.error(err);
+ });
+ return p.setViewport({width: 1024, height: 800});
+ });
+
+};
+
+exports.done = function done() {
+ if (page.browser) {
+ return page.browser().close();
+ } else {
+ return new Promise((resolve, reject) => {resolve();});
+ }
+};
+
+exports.getPage = function getPage() {
+ return new puptest.assertPageAction(page, exports.baseUrl);
+};
+
+exports.login = async function login() {
+ const p = this.getPage();
+ await p.goto('/');
+
+ // check popup shown
+ await p.click('#account-menu a.toggle-login-modal');
+ await p.waitForSelector('#login-modal', {timeout: 100});
+ await p.$evalOk('#login-modal', el => el.classList.contains("open"));
+
+ // check popup close
+ await p.click('#login-modal form .btn-default');
+ await p.waitForSelector('#login-modal', {hidden: true, timeout: 100});
+ await p.$evalNotOk('#login-modal', el => el.classList.contains("open"));
+
+ // popup open
+ await p.click('#account-menu .toggle-login-modal');
+ await p.waitForSelector('#login-modal', {timeout: 100});
+
+ // input ID/pass
+ await p.type('#login-nickname', this.username);
+ await p.type('#login-passwd', this.password);
+
+ // click login
+ await p.clickAndWaitForNavigation('#login-modal .dialog-footer .btn-primary',
+ {timeout: 1000});
+
+ // check login succeeded
+ const regex = new RegExp(`^\\s*${this.username}\\s*$`);
+ await p.$evalMatch(regex, '#user-menu a', el => el.innerHTML.trim());
+
+};
+
+exports.logout = async function logout() {
+ const p = this.getPage();
+ await p.goto('/');
+
+ // click user menu
+ await p.click('#user-menu a.dropdown-toggle');
+ await p.waitForSelector('#user-menu ul.dropdown-menu', {timeout: 100});
+
+ // clock logout
+ await p.clickAndWaitForNavigation('#user-menu ul.dropdown-menu a[href^="/logout"]',
+ {timeout: 1000});
+
+ // check login succeeded
+ await p.waitForSelector('#account-menu .toggle-login-modal', {timeout: 100});
+};
/* puptest - puppeteer with assert */
-// const puppeteer = require('puppeteer');
+const puppeteer = require('puppeteer');
const assert = require("assert");
const chai = require('chai');
+const chromiumArgs = ["--no-sandbox"];
+const chromiumPath = process.env.CHROMIUM_PATH || null;
+
+function newPage() {
+ const promise = puppeteer.launch({
+ executablePath: chromiumPath,
+ args: chromiumArgs,
+ ignoreHTTPSErrors: true,
+ });
+
+ return promise.then(browser => browser.newPage());
+}
+
class assertPageAction {
- constructor(page) {
+ constructor(page, baseUrl) {
this.page = page;
+ this.baseUrl = baseUrl;
};
_wrapDoesNotReject(method, message, args) {
return assert.doesNotReject(method.apply(this.page, args), message);
}
+ goto(url, options) {
+ return this.page.goto(this.baseUrl + url, options);
+ }
+
click(selector) {
return this._wrapDoesNotReject(this.page.click, `click "${selector}"`, arguments);
}
return this.page.$eval.apply(this.page, args).then(
resp => { chai.assert.match(resp, rex, `eval result for "${selector}" matches ${rex}`); });
}
+
+ $evalEqual(value, ...args) {
+ const selector = args[0];
+ return this.page.$eval.apply(this.page, args).then(
+ resp => { chai.assert.equal(resp, value, `eval result for "${selector}" matches ${value}`); });
+ }
}
exports.assertPageAction = assertPageAction;
+exports.newPage = newPage;
--- /dev/null
+const helper = require('../newslash-test-helper');
+
+describe('Login/Logout', function () {
+
+ before(async () => { await helper.init(); });
+ after(async () => { await helper.done(); });
+
+ describe('Login', function () {
+ this.timeout(5000);
+ it('succeeds', async function () {
+ await helper.login();
+ });
+ });
+
+ describe('Logout', function () {
+ this.timeout(5000);
+ it('succeeds', async function () {
+ await helper.logout();
+ });
+ });
+});
--- /dev/null
+const helper = require('../newslash-test-helper');
+
+describe('Submittion, Create Story', function () {
+
+ before(async () => { await helper.init(); });
+ after(async () => { await helper.done(); });
+
+ describe('Submittion page', function () {
+ this.timeout(5000);
+ const title = `test at ${(new Date()).toISOString()}`;
+ const body = "This is test submission. これはテストタレコミです。\n\n" +
+ "<a href='http://example.com/'>タグのテスト</a>";
+ const url = "http://example.com/";
+ const mail = "";
+ const tag = "foo bar hoge news";
+
+ it('open', async function () {
+ const p = helper.getPage();
+ await p.goto('/submission/new');
+ });
+
+ it('type and confirm submission', async function () {
+ const p = helper.getPage();
+
+ await p.type('#post-title', title);
+ await p.type('#post-introtext', body);
+ await p.type('#post-url', url);
+ await p.type('#post-email', mail);
+ await p.type('#tag-single', tag);
+
+ await p.click('#post-submission button[type="submit"]');
+ await p.waitForSelector('#post-title', {hidden: true, timeout: 100});
+ });
+
+ it('check preview content, submit', async function () {
+ const p = helper.getPage();
+ await p.$evalEqual(title, '#post-preview header h1 span', el => el.innerHTML.trim());
+
+ await p.click('#post-submit button[type="submit"]');
+ await p.waitForSelector('#post-submit button[type="submit"]', {hiddne: true, timeout: 1000});
+ await p.waitForSelector('.journal-editor .alert-info', {timeout: 1000});
+ });
+
+
+ });
+
+ // describe('Create Story', function () {
+ // this.timeout(5000);
+ // it('login', async function () {
+ // const p = await helper.login();
+ // });
+ // });
+
+});
+++ /dev/null
-const puppeteer = require('puppeteer');
-const expect = require('chai').expect;
-const assert = require('assert');
-const puptest = require("../puptest");
-
-const baseUrl = process.env.TEST_HOST; // "https://newslash-dev:3000";
-const chromiumArgs = ["--no-sandbox"];
-const username = process.env.TEST_USER;
-const password = process.env.TEST_PASSWORD;
-const chromiumPath = process.env.CHROMIUM_PATH || null;
-
-describe('Top Page', function () {
- let browser;
- let page;
-
- before(async () => {
- expect(username).to.not.have.lengthOf(0);
- expect(password).to.not.have.lengthOf(0);
-
- browser = await puppeteer.launch({
- executablePath: chromiumPath,
- args: chromiumArgs,
- ignoreHTTPSErrors: true,
- });
- page = await browser.newPage();
- page.setViewport({width: 1024, height: 800});
- });
-
- after(async () => {
- // done
- await browser.close();
- });
-
- describe('login', function () {
- this.timeout(5000);
-
- it('succeeds', async function () {
- const p = new puptest.assertPageAction(page);
- await page.goto(baseUrl);
-
- // check popup shown
- await p.click('#account-menu a.toggle-login-modal');
- await p.waitForSelector('#login-modal', {timeout: 100});
- await p.$evalOk('#login-modal', el => el.classList.contains("open"));
-
- // check popup close
- await p.click('#login-modal form .btn-default');
- await p.waitForSelector('#login-modal', {hidden: true, timeout: 100});
- await p.$evalNotOk('#login-modal', el => el.classList.contains("open"));
-
- // popup open
- await p.click('#account-menu .toggle-login-modal');
- await p.waitForSelector('#login-modal', {timeout: 100});
-
- // input ID/pass
- await p.type('#login-nickname', username);
- await p.type('#login-passwd', password);
-
- // clock login
- await p.clickAndWaitForNavigation('#login-modal .dialog-footer .btn-primary',
- {timeout: 1000});
-
- // check login succeeded
- const regex = new RegExp(`^\\s*${username}\\s*$`);
- await p.$evalMatch(regex, '#user-menu a', el => el.innerHTML.trim());
-
- });
- });
-
- describe('logout', function () {
- this.timeout(5000);
- it('succeeds', async function () {
- const p = new puptest.assertPageAction(page);
- await page.goto(baseUrl);
-
- // click user menu
- await p.click('#user-menu a.dropdown-toggle');
- await p.waitForSelector('#user-menu ul.dropdown-menu', {timeout: 100});
-
- // clock logout
- await p.clickAndWaitForNavigation('#user-menu ul.dropdown-menu a[href^="/logout"]',
- {timeout: 1000});
-
- // check login succeeded
- await p.waitForSelector('#account-menu .toggle-login-modal', {timeout: 100});
- });
- });
-});