cypress_rails 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +62 -0
  3. data/.gitignore +3 -0
  4. data/README.md +1 -1
  5. data/bin/cypress-rails +5 -0
  6. data/cypress_rails.gemspec +5 -3
  7. data/lib/cypress_rails/cli.rb +61 -0
  8. data/lib/cypress_rails/runner.rb +31 -0
  9. data/lib/cypress_rails/server.rb +8 -15
  10. data/lib/cypress_rails/version.rb +1 -1
  11. data/lib/cypress_rails.rb +1 -23
  12. data/spec/cypress_rails/runner_spec.rb +83 -0
  13. data/spec/cypress_rails/server_spec.rb +10 -11
  14. data/spec/spec_helper.rb +2 -0
  15. data/spec/support/dummy_failing/config.ru +19 -0
  16. data/spec/support/dummy_failing/cypress/integration/basic_spec.js +10 -0
  17. data/spec/support/dummy_failing/cypress/plugins/index.js +17 -0
  18. data/spec/support/dummy_failing/cypress/support/commands.js +25 -0
  19. data/spec/support/dummy_failing/cypress/support/index.js +20 -0
  20. data/spec/support/dummy_failing/cypress.json +1 -0
  21. data/spec/support/dummy_failing/package.json +14 -0
  22. data/spec/support/dummy_failing/yarn.lock +1018 -0
  23. data/spec/support/dummy_passing/config.ru +19 -0
  24. data/spec/support/dummy_passing/cypress/integration/basic_spec.js +10 -0
  25. data/spec/support/dummy_passing/cypress/plugins/index.js +17 -0
  26. data/spec/support/dummy_passing/cypress/support/commands.js +25 -0
  27. data/spec/support/dummy_passing/cypress/support/index.js +20 -0
  28. data/spec/support/dummy_passing/cypress.json +1 -0
  29. data/spec/support/dummy_passing/package.json +14 -0
  30. data/spec/support/dummy_passing/yarn.lock +1018 -0
  31. metadata +82 -18
  32. data/.travis.yml +0 -9
  33. data/spec/support/dummy/config.ru +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: '0960d9a791f200510066c77fe170e1df621d7e60'
4
- data.tar.gz: e5a7cbba16e63adf40b52ab0921dc2785e78bf9f
3
+ metadata.gz: 80aae4380a1af0433ae1b914dbcbc6ee37263132
4
+ data.tar.gz: b564ccbc5a13d27a1f37dafab087c9147b7d5aea
5
5
  SHA512:
6
- metadata.gz: 69c7165251fd91bdb505a5762463e8d4699b8ee9497ce2e73595bc9b17fc848cc93a50d6446027bfbc3203b48bb4e20036ab7757ee2e936393fc137cca0ef867
7
- data.tar.gz: b571aa52a32bc6f710798058c26a736502080d0a10ab71a0dbeb8d5b360a09806c15567b5be707f1cc2a93cf106c707272d50841007f518c96aa23341a056cd6
6
+ metadata.gz: 1340b659aab5c49c6958dbdefc3a02986987e0ca03ddd9c98ca78f13507be7513d9ce76d4a8cce7e3e9eb338dafb2c582f0cbc62ad9a3ef0694a3f433c68b417
7
+ data.tar.gz: e58a245a1965c6a022c7bbb82a8e200755a1f5114c270d7ee588368e6fb676282c212d74b4e5d0afe2d079eac38d60968ce11d3258100b693f96467570032307
@@ -0,0 +1,62 @@
1
+ version: 2
2
+ jobs:
3
+ build:
4
+ docker:
5
+ - image: circleci/ruby:2-node
6
+ working_directory: ~/repo
7
+ steps:
8
+ - checkout
9
+ - run: sudo apt-get update
10
+ - run: sudo apt-get install xvfb libgtk2.0-0 libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2
11
+ - restore_cache:
12
+ keys:
13
+ - v1-dependencies-{{ checksum "cypress_rails.gemspec" }}
14
+ - v1-dependencies-
15
+ - restore_cache:
16
+ keys:
17
+ - v1-passing-node-modules-{{ checksum "./spec/support/dummy_passing/yarn.lock" }}
18
+ - v1-passing-node-modules-
19
+ - restore_cache:
20
+ keys:
21
+ - v1-failing-node-modules-{{ checksum "./spec/support/dummy_failing/yarn.lock" }}
22
+ - v1-failing-node-modules-
23
+ - run:
24
+ name: install dependencies
25
+ command: |
26
+ bundle install --jobs=4 --retry=3 --path vendor/bundle
27
+ - run:
28
+ name: Install passing node dependencies
29
+ command: |
30
+ cd spec/support/dummy_passing && yarn install && npx cypress install && cd -
31
+ - run:
32
+ name: Install failing node dependencies
33
+ command: |
34
+ cd spec/support/dummy_failing && yarn install && npx cypress install && cd -
35
+ - save_cache:
36
+ paths:
37
+ - ./vendor/bundle
38
+ key: v1-dependencies-{{ checksum "Gemfile.lock" }}
39
+ - save_cache:
40
+ paths:
41
+ - ./spec/support/dummy_passing/node_modules
42
+ key: v1-passing-node-dependencies-{{ checksum "./spec/support/dummy_passing/yarn.lock" }}
43
+ - save_cache:
44
+ paths:
45
+ - ./spec/support/dummy_failing/node_modules
46
+ key: v1-failing-node-dependencies-{{ checksum "./spec/support/dummy_failing/yarn.lock" }}
47
+ - run:
48
+ name: run tests
49
+ command: |
50
+ mkdir /tmp/test-results
51
+ TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"
52
+
53
+ bundle exec rspec --format progress \
54
+ --format RspecJunitFormatter \
55
+ --out /tmp/test-results/rspec.xml \
56
+ --format progress \
57
+ $TEST_FILES
58
+ - store_test_results:
59
+ path: /tmp/test-results
60
+ - store_artifacts:
61
+ path: /tmp/test-results
62
+ destination: test-results
data/.gitignore CHANGED
@@ -3,3 +3,6 @@
3
3
  /html/
4
4
  /pkg/
5
5
  /vendor/cache/*.gem
6
+ **/node_modules/
7
+ **/cypress/videos/
8
+ **/cypress/screenshots/
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  * [Documentation](http://rubydoc.info/gems/cypress_rails/frames)
5
5
  * [Email](mailto:szymon@szeliga.co)
6
6
 
7
- [![Build Status](https://secure.travis-ci.org/Szeliga/cypress_rails.svg?branch=master)](https://travis-ci.org/Szeliga/cypress_rails)
7
+ [![CircleCI](https://circleci.com/gh/Szeliga/cypress_rails/tree/master.svg?style=svg)](https://circleci.com/gh/Szeliga/cypress_rails/tree/master)
8
8
  [![Code Climate GPA](https://codeclimate.com/github/Szeliga/cypress_rails/badges/gpa.svg)](https://codeclimate.com/github/Szeliga/cypress_rails)
9
9
 
10
10
  ## Description
data/bin/cypress-rails ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "cypress_rails/cli"
4
+
5
+ CypressRails::CLI.start(ARGV)
@@ -29,13 +29,15 @@ Gem::Specification.new do |gem|
29
29
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
30
30
  gem.require_paths = ["lib"]
31
31
 
32
+ gem.add_dependency "thor", "~> 0.20.0"
32
33
  gem.add_development_dependency "bundler", "~> 1.10"
33
34
  gem.add_development_dependency "codeclimate-test-reporter", "~> 0.1"
34
- gem.add_development_dependency "pry"
35
- gem.add_development_dependency "rack"
35
+ gem.add_development_dependency "pry", "~> 0.11.3"
36
+ gem.add_development_dependency "rack", "~> 2.0.5"
36
37
  gem.add_development_dependency "rake", "~> 10.0"
37
38
  gem.add_development_dependency "rdoc", "~> 4.0"
38
39
  gem.add_development_dependency "rspec", "~> 3.0"
39
- gem.add_development_dependency "rubocop"
40
+ gem.add_development_dependency "rubocop", "~> 0.55.0"
40
41
  gem.add_development_dependency "rubygems-tasks", "~> 0.2"
42
+ gem.add_development_dependency "rspec_junit_formatter", "~> 0.3.0"
41
43
  end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "thor"
4
+ require "cypress_rails/runner"
5
+ require "cypress_rails/server"
6
+
7
+ module CypressRails
8
+ Config = Struct.new(:command, :cypress_command, :host, :log_path, :test_path)
9
+
10
+ class CLI < Thor
11
+ class_option :command,
12
+ required: true,
13
+ type: :string,
14
+ desc: "command to start the server",
15
+ aliases: %w(-c)
16
+ class_option :cypress_command,
17
+ type: :string,
18
+ desc: "command to run cypress",
19
+ default: "npx cypress",
20
+ aliases: %w(-cc)
21
+ class_option :host,
22
+ type: :string,
23
+ desc: "host on which to start the local server",
24
+ default: "localhost",
25
+ aliases: %w(-h)
26
+ class_option :log_path,
27
+ type: :string,
28
+ desc: "path to the log file for the server",
29
+ default: "/dev/null",
30
+ aliases: %w(-l)
31
+ class_option :test_path,
32
+ type: :string,
33
+ desc: "path to Cypress tests",
34
+ default: "./spec/cypress",
35
+ aliases: %w(-t)
36
+
37
+ desc "test", "Run all tests in headless mode"
38
+ def test
39
+ server.start do |host, port|
40
+ exit Runner.new(host: host, port: port, command: config.cypress_command).run
41
+ end
42
+ end
43
+
44
+ desc "open", "Start the server and open Cypress Dashboard"
45
+ def open
46
+ puts options
47
+ end
48
+
49
+ private
50
+
51
+ def server
52
+ @server ||= Server.new(config.host, config.command, config.log_path)
53
+ end
54
+
55
+ def config
56
+ @config ||= Config.new(
57
+ *options.values_at(:command, :cypress_command, :host, :log_path, :test_path)
58
+ )
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CypressRails
4
+ class Runner
5
+ def initialize(host:, port:, command: "npx cypress", output: IO.new(1))
6
+ @host = host
7
+ @port = port
8
+ @command = command
9
+ @output = output
10
+ end
11
+
12
+ def run
13
+ pid = Process.spawn(
14
+ {
15
+ "CYPRESS_app_host" => host,
16
+ "CYPRESS_app_port" => port.to_s,
17
+ },
18
+ command,
19
+ out: output,
20
+ err: [:child, :out]
21
+ )
22
+ output.close
23
+ _, status = Process.wait2(pid)
24
+ status.exitstatus
25
+ end
26
+
27
+ private
28
+
29
+ attr_reader :host, :port, :command, :output
30
+ end
31
+ end
@@ -6,11 +6,13 @@ module CypressRails
6
6
  class Server
7
7
  extend Forwardable
8
8
 
9
- attr_reader :host, :port
9
+ attr_reader :host, :port, :command, :log_path
10
10
 
11
- def initialize(host)
11
+ def initialize(host, command, log_path)
12
12
  @host = host
13
13
  @port = find_free_port
14
+ @command = command
15
+ @log_path = log_path
14
16
  end
15
17
 
16
18
  def start
@@ -18,7 +20,8 @@ module CypressRails
18
20
  until server_responsive?
19
21
  sleep 0.1
20
22
  end
21
- yield if block_given?
23
+ yield(host, port) if block_given?
24
+ ensure
22
25
  stop_server
23
26
  end
24
27
 
@@ -26,10 +29,6 @@ module CypressRails
26
29
 
27
30
  attr_reader :pid
28
31
 
29
- def_delegators :configuration,
30
- :server_command,
31
- :log_path
32
-
33
32
  def spawn_server
34
33
  @pid = Process.spawn(
35
34
  build_command,
@@ -48,13 +47,11 @@ module CypressRails
48
47
  end
49
48
 
50
49
  def stop_server
51
- Process.kill("SIGINT", pid)
50
+ Process.kill("SIGINT", pid) if pid
52
51
  end
53
52
 
54
53
  def build_command
55
- command = [server_command]
56
- command << "--port #{port}"
57
- command.join(" ")
54
+ "#{command} --port #{port}"
58
55
  end
59
56
 
60
57
  def find_free_port
@@ -63,9 +60,5 @@ module CypressRails
63
60
  ensure
64
61
  server.close if server
65
62
  end
66
-
67
- def configuration
68
- CypressRails.configuration
69
- end
70
63
  end
71
64
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module CypressRails
4
4
  # cypress_rails version
5
- VERSION = "0.1.0"
5
+ VERSION = "0.2.0"
6
6
  end
data/lib/cypress_rails.rb CHANGED
@@ -1,25 +1,3 @@
1
1
  # frozen_string_literal: true
2
-
3
- require "singleton"
2
+ #
4
3
  require "cypress_rails/version"
5
-
6
- module CypressRails
7
- def self.configure
8
- yield(configuration)
9
- end
10
-
11
- def self.configuration
12
- Configuration.instance
13
- end
14
-
15
- class Configuration
16
- include Singleton
17
-
18
- attr_accessor :server_command, :log_path
19
-
20
- def initialize
21
- @server_command = ""
22
- @log_path = "/dev/null"
23
- end
24
- end
25
- end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "cypress_rails/server"
5
+ require "cypress_rails/runner"
6
+
7
+ RSpec.describe CypressRails::Runner do
8
+ let(:host) { "localhost" }
9
+ let(:log_path) { "/dev/null" }
10
+ let(:pipe) { IO.pipe }
11
+ let(:w) { pipe[1] }
12
+ let(:r) { pipe[0] }
13
+
14
+ context "when tests are passing" do
15
+ let(:command) { "rackup spec/support/dummy_passing/config.ru" }
16
+
17
+ it "runs cypress correctly" do
18
+ CypressRails::Server.new(host, command, log_path).start do |host, port|
19
+ CypressRails::Runner.new(
20
+ host: host,
21
+ port: port,
22
+ command: "cd spec/support/dummy_passing && npx cypress run",
23
+ output: w
24
+ ).run
25
+ end
26
+ result = r.read
27
+ expect(result).to match(/Visiting the root address/)
28
+ expect(result).to match(/renders OK/)
29
+ expect(result).to match(/\(Tests Finished\)/)
30
+ r.close
31
+ end
32
+
33
+ it "returns status code 0" do
34
+ status = nil
35
+ CypressRails::Server.new(host, command, log_path).start do |host, port|
36
+ status = CypressRails::Runner.new(
37
+ host: host,
38
+ port: port,
39
+ command: "cd spec/support/dummy_passing && npx cypress run",
40
+ output: w
41
+ ).run
42
+ end
43
+ r.read
44
+ r.close
45
+ expect(status).to eq 0
46
+ end
47
+ end
48
+
49
+ context "when tests are failing" do
50
+ let(:command) { "rackup spec/support/dummy_failing/config.ru" }
51
+
52
+ it "runs cypress correctly" do
53
+ CypressRails::Server.new(host, command, log_path).start do |host, port|
54
+ CypressRails::Runner.new(
55
+ host: host,
56
+ port: port,
57
+ command: "cd spec/support/dummy_failing && npx cypress run",
58
+ output: w
59
+ ).run
60
+ end
61
+ result = r.read
62
+ expect(result).to match(/Visiting the root address/)
63
+ expect(result).to match(/renders OK/)
64
+ expect(result).to match(/\(Tests Finished\)/)
65
+ r.close
66
+ end
67
+
68
+ it "returns non-zero status code" do
69
+ status = nil
70
+ CypressRails::Server.new(host, command, log_path).start do |host, port|
71
+ status = CypressRails::Runner.new(
72
+ host: host,
73
+ port: port,
74
+ command: "cd spec/support/dummy_failing && npx cypress run",
75
+ output: w
76
+ ).run
77
+ end
78
+ r.read
79
+ r.close
80
+ expect(status).not_to eq 0
81
+ end
82
+ end
83
+ end
@@ -2,33 +2,32 @@
2
2
 
3
3
  require "spec_helper"
4
4
  require "open-uri"
5
- require "cypress_rails"
6
5
  require "cypress_rails/server"
7
6
 
8
7
  RSpec.describe CypressRails::Server do
9
- describe "#port" do
10
- subject(:port) { described_class.new("localhost").port }
8
+ let(:host) { "localhost" }
9
+ let(:command) { "rackup spec/support/dummy_passing/config.ru" }
10
+ let(:log_path) { "/dev/null" }
11
11
 
12
- it "assigns a port number from the ephemeral range" do
13
- expect(49152..65535).to cover(port)
14
- end
12
+ describe "#port" do
13
+ subject(:port) { described_class.new(host, command, log_path).port }
15
14
 
16
15
  it { is_expected.to be_open_port }
17
16
  end
18
17
 
19
18
  describe "#start" do
20
- subject(:server) { described_class.new("localhost") }
19
+ subject(:server) { described_class.new(host, command, log_path) }
21
20
 
22
21
  it "starts the server and blocks until it is ready" do
23
- CypressRails.configure do |config|
24
- config.server_command = "rackup spec/support/dummy/config.ru"
25
- end
26
-
27
22
  response = nil
28
23
  server.start {
29
24
  response = open("http://localhost:#{server.port}")
30
25
  }
31
26
  expect(response.status).to include "200"
32
27
  end
28
+
29
+ it "yields the port number and host into the block" do
30
+ expect { |b| server.start(&b) }.to yield_with_args("localhost", server.port)
31
+ end
33
32
  end
34
33
  end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rspec"
4
+ require "pry"
5
+
4
6
  Dir[File.expand_path("support/**/*.rb", __dir__)].each { |file| require file }