OSDN Git Service

browser-test: add helper modules
authorhylom <hylom@users.sourceforge.jp>
Thu, 23 Aug 2018 11:54:20 +0000 (20:54 +0900)
committerhylom <hylom@users.sourceforge.jp>
Thu, 23 Aug 2018 11:54:20 +0000 (20:54 +0900)
browser-test/src/newslash-test-helper.js [new file with mode: 0644]
browser-test/src/puptest.js
browser-test/src/test/00login-logout.js [new file with mode: 0644]
browser-test/src/test/10create-story.js [new file with mode: 0644]
browser-test/src/test/basic.js [deleted file]

diff --git a/browser-test/src/newslash-test-helper.js b/browser-test/src/newslash-test-helper.js
new file mode 100644 (file)
index 0000000..03550cc
--- /dev/null
@@ -0,0 +1,84 @@
+/* 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});
+};
index 139c934..3894a3b 100644 (file)
@@ -1,17 +1,35 @@
 /* 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);
   }
@@ -54,6 +72,13 @@ class assertPageAction {
     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;
diff --git a/browser-test/src/test/00login-logout.js b/browser-test/src/test/00login-logout.js
new file mode 100644 (file)
index 0000000..2fbaabe
--- /dev/null
@@ -0,0 +1,21 @@
+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();
+    });
+  });
+});
diff --git a/browser-test/src/test/10create-story.js b/browser-test/src/test/10create-story.js
new file mode 100644 (file)
index 0000000..d629fa2
--- /dev/null
@@ -0,0 +1,54 @@
+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();
+  //   });
+  // });
+
+});
diff --git a/browser-test/src/test/basic.js b/browser-test/src/test/basic.js
deleted file mode 100644 (file)
index e5ef756..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-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});
-    });
-  });
-});