diff options
author | rmacklin <1863540+rmacklin@users.noreply.github.com> | 2018-11-26 14:16:02 -0800 |
---|---|---|
committer | Javan Makhmali <javan@javan.us> | 2018-11-26 17:16:02 -0500 |
commit | 85b080365313437f646070ca214fef433c06db6a (patch) | |
tree | a2df565070129cef9f5064b565229a1a9ad96be5 /actioncable/test/javascript/src | |
parent | 38b676181b7cce5191b1877ad6781c490d38436d (diff) | |
download | rails-85b080365313437f646070ca214fef433c06db6a.tar.gz rails-85b080365313437f646070ca214fef433c06db6a.tar.bz2 rails-85b080365313437f646070ca214fef433c06db6a.zip |
Convert ActionCable tests from CoffeeScript to ES2015 and replace Blade with Karma and Rollup (#34440)
* Rename .coffee files in ActionCable test suite in prep for decaffeination
* Decaffeinate ActionCable tests
* Replace Blade with Karma and Rollup to run ActionCable JS tests
- Add karma and qunit devDependencies
- Add test script to ActionCable package
- Use rollup to bundle ActionCable tests
- Use karma as the ActionCable JS test runner
* Replace vendored mock-socket with package devDependency in ActionCable
* Move ActionCable yarn install to TravisCI before_install config
* Clean up decaffeinated ActionCable tests to use consistent formatting
Diffstat (limited to 'actioncable/test/javascript/src')
14 files changed, 232 insertions, 181 deletions
diff --git a/actioncable/test/javascript/src/test.coffee b/actioncable/test/javascript/src/test.coffee deleted file mode 100644 index eb95fb2604..0000000000 --- a/actioncable/test/javascript/src/test.coffee +++ /dev/null @@ -1,3 +0,0 @@ -#= require action_cable -#= require ./test_helpers -#= require_tree ./unit diff --git a/actioncable/test/javascript/src/test.js b/actioncable/test/javascript/src/test.js new file mode 100644 index 0000000000..1fca7ab4d3 --- /dev/null +++ b/actioncable/test/javascript/src/test.js @@ -0,0 +1,5 @@ +import "./test_helpers/index" +import "./unit/action_cable_test" +import "./unit/consumer_test" +import "./unit/subscription_test" +import "./unit/subscriptions_test" diff --git a/actioncable/test/javascript/src/test_helpers/consumer_test_helper.coffee b/actioncable/test/javascript/src/test_helpers/consumer_test_helper.coffee deleted file mode 100644 index a9e95c37f0..0000000000 --- a/actioncable/test/javascript/src/test_helpers/consumer_test_helper.coffee +++ /dev/null @@ -1,47 +0,0 @@ -#= require mock-socket - -{TestHelpers} = ActionCable - -TestHelpers.consumerTest = (name, options = {}, callback) -> - unless callback? - callback = options - options = {} - - options.url ?= TestHelpers.testURL - - QUnit.test name, (assert) -> - doneAsync = assert.async() - - ActionCable.WebSocket = MockWebSocket - server = new MockServer options.url - consumer = ActionCable.createConsumer(options.url) - - server.on "connection", -> - clients = server.clients() - assert.equal clients.length, 1 - assert.equal clients[0].readyState, WebSocket.OPEN - - server.broadcastTo = (subscription, data = {}, callback) -> - data.identifier = subscription.identifier - - if data.message_type - data.type = ActionCable.INTERNAL.message_types[data.message_type] - delete data.message_type - - server.send(JSON.stringify(data)) - TestHelpers.defer(callback) - - done = -> - consumer.disconnect() - server.close() - doneAsync() - - testData = {assert, consumer, server, done} - - if options.connect is false - callback(testData) - else - server.on "connection", -> - testData.client = server.clients()[0] - callback(testData) - consumer.connect() diff --git a/actioncable/test/javascript/src/test_helpers/consumer_test_helper.js b/actioncable/test/javascript/src/test_helpers/consumer_test_helper.js new file mode 100644 index 0000000000..f1abea331b --- /dev/null +++ b/actioncable/test/javascript/src/test_helpers/consumer_test_helper.js @@ -0,0 +1,58 @@ +import { WebSocket as MockWebSocket, Server as MockServer } from "mock-socket" +import ActionCable from "../../../../app/javascript/action_cable/index" +import {defer, testURL} from "./index" + +export default function(name, options, callback) { + if (options == null) { options = {} } + if (callback == null) { + callback = options + options = {} + } + + if (options.url == null) { options.url = testURL } + + return QUnit.test(name, function(assert) { + const doneAsync = assert.async() + + ActionCable.WebSocket = MockWebSocket + const server = new MockServer(options.url) + const consumer = ActionCable.createConsumer(options.url) + + server.on("connection", function() { + const clients = server.clients() + assert.equal(clients.length, 1) + assert.equal(clients[0].readyState, WebSocket.OPEN) + }) + + server.broadcastTo = function(subscription, data, callback) { + if (data == null) { data = {} } + data.identifier = subscription.identifier + + if (data.message_type) { + data.type = ActionCable.INTERNAL.message_types[data.message_type] + delete data.message_type + } + + server.send(JSON.stringify(data)) + defer(callback) + } + + const done = function() { + consumer.disconnect() + server.close() + doneAsync() + } + + const testData = {assert, consumer, server, done} + + if (options.connect === false) { + callback(testData) + } else { + server.on("connection", function() { + testData.client = server.clients()[0] + callback(testData) + }) + consumer.connect() + } + }) +} diff --git a/actioncable/test/javascript/src/test_helpers/index.coffee b/actioncable/test/javascript/src/test_helpers/index.coffee deleted file mode 100644 index c84cbbcb2c..0000000000 --- a/actioncable/test/javascript/src/test_helpers/index.coffee +++ /dev/null @@ -1,11 +0,0 @@ -#= require_self -#= require_tree . - -ActionCable.TestHelpers = - testURL: "ws://cable.example.com/" - - defer: (callback) -> - setTimeout(callback, 1) - -originalWebSocket = ActionCable.WebSocket -QUnit.testDone -> ActionCable.WebSocket = originalWebSocket diff --git a/actioncable/test/javascript/src/test_helpers/index.js b/actioncable/test/javascript/src/test_helpers/index.js new file mode 100644 index 0000000000..5fa46c21ae --- /dev/null +++ b/actioncable/test/javascript/src/test_helpers/index.js @@ -0,0 +1,10 @@ +import ActionCable from "../../../../app/javascript/action_cable/index" + +export const testURL = "ws://cable.example.com/" + +export function defer(callback) { + setTimeout(callback, 1) +} + +const originalWebSocket = ActionCable.WebSocket +QUnit.testDone(() => ActionCable.WebSocket = originalWebSocket) diff --git a/actioncable/test/javascript/src/unit/action_cable_test.coffee b/actioncable/test/javascript/src/unit/action_cable_test.coffee deleted file mode 100644 index 3944f3a7f6..0000000000 --- a/actioncable/test/javascript/src/unit/action_cable_test.coffee +++ /dev/null @@ -1,41 +0,0 @@ -{module, test} = QUnit -{testURL} = ActionCable.TestHelpers - -module "ActionCable", -> - module "Adapters", -> - module "WebSocket", -> - test "default is window.WebSocket", (assert) -> - assert.equal ActionCable.WebSocket, window.WebSocket - - test "configurable", (assert) -> - ActionCable.WebSocket = "" - assert.equal ActionCable.WebSocket, "" - - module "logger", -> - test "default is window.console", (assert) -> - assert.equal ActionCable.logger, window.console - - test "configurable", (assert) -> - ActionCable.logger = "" - assert.equal ActionCable.logger, "" - - module "#createConsumer", -> - test "uses specified URL", (assert) -> - consumer = ActionCable.createConsumer(testURL) - assert.equal consumer.url, testURL - - test "uses default URL", (assert) -> - pattern = ///#{ActionCable.INTERNAL.default_mount_path}$/// - consumer = ActionCable.createConsumer() - assert.ok pattern.test(consumer.url), "Expected #{consumer.url} to match #{pattern}" - - test "uses URL from meta tag", (assert) -> - element = document.createElement("meta") - element.setAttribute("name", "action-cable-url") - element.setAttribute("content", testURL) - - document.head.appendChild(element) - consumer = ActionCable.createConsumer() - document.head.removeChild(element) - - assert.equal consumer.url, testURL diff --git a/actioncable/test/javascript/src/unit/action_cable_test.js b/actioncable/test/javascript/src/unit/action_cable_test.js new file mode 100644 index 0000000000..8847d87545 --- /dev/null +++ b/actioncable/test/javascript/src/unit/action_cable_test.js @@ -0,0 +1,55 @@ +import ActionCable from "../../../../app/javascript/action_cable/index" +import {testURL} from "../test_helpers/index" + +const {module, test} = QUnit + +module("ActionCable", () => { + module("Adapters", () => { + module("WebSocket", () => { + test("default is window.WebSocket", assert => { + assert.equal(ActionCable.WebSocket, window.WebSocket) + }) + + test("configurable", assert => { + ActionCable.WebSocket = "" + assert.equal(ActionCable.WebSocket, "") + }) + }) + + module("logger", () => { + test("default is window.console", assert => { + assert.equal(ActionCable.logger, window.console) + }) + + test("configurable", assert => { + ActionCable.logger = "" + assert.equal(ActionCable.logger, "") + }) + }) + }) + + module("#createConsumer", () => { + test("uses specified URL", assert => { + const consumer = ActionCable.createConsumer(testURL) + assert.equal(consumer.url, testURL) + }) + + test("uses default URL", assert => { + const pattern = new RegExp(`${ActionCable.INTERNAL.default_mount_path}$`) + const consumer = ActionCable.createConsumer() + assert.ok(pattern.test(consumer.url), `Expected ${consumer.url} to match ${pattern}`) + }) + + test("uses URL from meta tag", assert => { + const element = document.createElement("meta") + element.setAttribute("name", "action-cable-url") + element.setAttribute("content", testURL) + + document.head.appendChild(element) + const consumer = ActionCable.createConsumer() + document.head.removeChild(element) + + assert.equal(consumer.url, testURL) + }) + }) +}) diff --git a/actioncable/test/javascript/src/unit/consumer_test.coffee b/actioncable/test/javascript/src/unit/consumer_test.coffee deleted file mode 100644 index 41445274eb..0000000000 --- a/actioncable/test/javascript/src/unit/consumer_test.coffee +++ /dev/null @@ -1,14 +0,0 @@ -{module, test} = QUnit -{consumerTest} = ActionCable.TestHelpers - -module "ActionCable.Consumer", -> - consumerTest "#connect", connect: false, ({consumer, server, assert, done}) -> - server.on "connection", -> - assert.equal consumer.connect(), false - done() - - consumer.connect() - - consumerTest "#disconnect", ({consumer, client, done}) -> - client.addEventListener("close", done) - consumer.disconnect() diff --git a/actioncable/test/javascript/src/unit/consumer_test.js b/actioncable/test/javascript/src/unit/consumer_test.js new file mode 100644 index 0000000000..acc618bf0c --- /dev/null +++ b/actioncable/test/javascript/src/unit/consumer_test.js @@ -0,0 +1,19 @@ +import consumerTest from "../test_helpers/consumer_test_helper" + +const {module} = QUnit + +module("ActionCable.Consumer", () => { + consumerTest("#connect", {connect: false}, ({consumer, server, assert, done}) => { + server.on("connection", () => { + assert.equal(consumer.connect(), false) + done() + }) + + consumer.connect() + }) + + consumerTest("#disconnect", ({consumer, client, done}) => { + client.addEventListener("close", done) + consumer.disconnect() + }) +}) diff --git a/actioncable/test/javascript/src/unit/subscription_test.coffee b/actioncable/test/javascript/src/unit/subscription_test.coffee deleted file mode 100644 index 07027ed170..0000000000 --- a/actioncable/test/javascript/src/unit/subscription_test.coffee +++ /dev/null @@ -1,40 +0,0 @@ -{module, test} = QUnit -{consumerTest} = ActionCable.TestHelpers - -module "ActionCable.Subscription", -> - consumerTest "#initialized callback", ({server, consumer, assert, done}) -> - consumer.subscriptions.create "chat", - initialized: -> - assert.ok true - done() - - consumerTest "#connected callback", ({server, consumer, assert, done}) -> - subscription = consumer.subscriptions.create "chat", - connected: -> - assert.ok true - done() - - server.broadcastTo(subscription, message_type: "confirmation") - - consumerTest "#disconnected callback", ({server, consumer, assert, done}) -> - subscription = consumer.subscriptions.create "chat", - disconnected: -> - assert.ok true - done() - - server.broadcastTo subscription, message_type: "confirmation", -> - server.close() - - consumerTest "#perform", ({consumer, server, assert, done}) -> - subscription = consumer.subscriptions.create "chat", - connected: -> - @perform(publish: "hi") - - server.on "message", (message) -> - data = JSON.parse(message) - assert.equal data.identifier, subscription.identifier - assert.equal data.command, "message" - assert.deepEqual data.data, JSON.stringify(action: { publish: "hi" }) - done() - - server.broadcastTo(subscription, message_type: "confirmation") diff --git a/actioncable/test/javascript/src/unit/subscription_test.js b/actioncable/test/javascript/src/unit/subscription_test.js new file mode 100644 index 0000000000..bf32e5f27d --- /dev/null +++ b/actioncable/test/javascript/src/unit/subscription_test.js @@ -0,0 +1,54 @@ +import consumerTest from "../test_helpers/consumer_test_helper" + +const {module} = QUnit + +module("ActionCable.Subscription", () => { + consumerTest("#initialized callback", ({server, consumer, assert, done}) => + consumer.subscriptions.create("chat", { + initialized() { + assert.ok(true) + done() + } + }) + ) + + consumerTest("#connected callback", ({server, consumer, assert, done}) => { + const subscription = consumer.subscriptions.create("chat", { + connected() { + assert.ok(true) + done() + } + }) + + server.broadcastTo(subscription, {message_type: "confirmation"}) + }) + + consumerTest("#disconnected callback", ({server, consumer, assert, done}) => { + const subscription = consumer.subscriptions.create("chat", { + disconnected() { + assert.ok(true) + done() + } + }) + + server.broadcastTo(subscription, {message_type: "confirmation"}, () => server.close()) + }) + + consumerTest("#perform", ({consumer, server, assert, done}) => { + const subscription = consumer.subscriptions.create("chat", { + connected() { + this.perform({publish: "hi"}) + } + }) + + server.on("message", (message) => { + const data = JSON.parse(message) + assert.equal(data.identifier, subscription.identifier) + assert.equal(data.command, "message") + assert.deepEqual(data.data, JSON.stringify({action: { publish: "hi" }})) + done() + }) + + server.broadcastTo(subscription, {message_type: "confirmation"}) + }) +}) diff --git a/actioncable/test/javascript/src/unit/subscriptions_test.coffee b/actioncable/test/javascript/src/unit/subscriptions_test.coffee deleted file mode 100644 index 170b370e4a..0000000000 --- a/actioncable/test/javascript/src/unit/subscriptions_test.coffee +++ /dev/null @@ -1,25 +0,0 @@ -{module, test} = QUnit -{consumerTest} = ActionCable.TestHelpers - -module "ActionCable.Subscriptions", -> - consumerTest "create subscription with channel string", ({consumer, server, assert, done}) -> - channel = "chat" - - server.on "message", (message) -> - data = JSON.parse(message) - assert.equal data.command, "subscribe" - assert.equal data.identifier, JSON.stringify({channel}) - done() - - consumer.subscriptions.create(channel) - - consumerTest "create subscription with channel object", ({consumer, server, assert, done}) -> - channel = channel: "chat", room: "action" - - server.on "message", (message) -> - data = JSON.parse(message) - assert.equal data.command, "subscribe" - assert.equal data.identifier, JSON.stringify(channel) - done() - - consumer.subscriptions.create(channel) diff --git a/actioncable/test/javascript/src/unit/subscriptions_test.js b/actioncable/test/javascript/src/unit/subscriptions_test.js new file mode 100644 index 0000000000..33af5d4d82 --- /dev/null +++ b/actioncable/test/javascript/src/unit/subscriptions_test.js @@ -0,0 +1,31 @@ +import consumerTest from "../test_helpers/consumer_test_helper" + +const {module} = QUnit + +module("ActionCable.Subscriptions", () => { + consumerTest("create subscription with channel string", ({consumer, server, assert, done}) => { + const channel = "chat" + + server.on("message", (message) => { + const data = JSON.parse(message) + assert.equal(data.command, "subscribe") + assert.equal(data.identifier, JSON.stringify({channel})) + done() + }) + + consumer.subscriptions.create(channel) + }) + + consumerTest("create subscription with channel object", ({consumer, server, assert, done}) => { + const channel = {channel: "chat", room: "action"} + + server.on("message", (message) => { + const data = JSON.parse(message) + assert.equal(data.command, "subscribe") + assert.equal(data.identifier, JSON.stringify(channel)) + done() + }) + + consumer.subscriptions.create(channel) + }) +}) |