learn-test 2.5.5 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6c1be4c855a56a6a9d4e3b3808372f60f5fc5f62
4
- data.tar.gz: a5b84385efc631eb54aee171f8bd15d4b0240576
2
+ SHA256:
3
+ metadata.gz: c948f2caf79d93517b52039c6eaafba297c3189cd293e3c818e3c95b4edb7cf4
4
+ data.tar.gz: 97078125943000129c610efc4e123bf70e41e47a7976a04b357ce50061d9ba10
5
5
  SHA512:
6
- metadata.gz: d27c877833905071f46de47f13a35773b34d204bd2408c39108eac291db7d989e960e766078ae4523dc3480c55e348297562f628b2658ac95176fbee4ccd9797
7
- data.tar.gz: ae23477e6e0ed28ca04b9e828a17c6033aba2ac356839434695904215b59ddde657b196f41bf50006b09e238f1908e5211274bd106db064186917ce6691441ee
6
+ metadata.gz: 0d82451677d20b13cf4da73e8b49c1e2fd0087bddc13b4062155c95f1a37a195133ca48a401bc4006450810770c40c162041e0e5d683c9a4957e1d5cbca8bfb9
7
+ data.tar.gz: 1be5ba0a56c28565abea74b2550698db88920f51fe8cf8a684cc4a2100fd29cc5ec501ded4b4befb57dcae7ab29b67785f254bed4a257c8233fe938dd39a68cd
@@ -0,0 +1,59 @@
1
+ version: 2.1
2
+
3
+ jobs:
4
+ build:
5
+ docker:
6
+ - image: circleci/ruby:2.5.8
7
+
8
+ working_directory: ~/repo
9
+
10
+ steps:
11
+ - checkout
12
+
13
+ - restore_cache:
14
+ keys:
15
+ - gems-v3-{{ checksum "Gemfile.lock" }}
16
+ - gems-v3-
17
+
18
+ - run:
19
+ name: Force Bundler Version
20
+ command: |
21
+ sudo gem update --system
22
+ echo 'export BUNDLER_VERSION=$(cat Gemfile.lock | tail -1 | tr -d " ")' >> $BASH_ENV
23
+ source $BASH_ENV
24
+
25
+ - run:
26
+ name: Install Dependencies
27
+ command: |
28
+ bundle config --local set vendor/bundle
29
+ bundle install
30
+
31
+ - save_cache:
32
+ key: gems-v3-{{ checksum "Gemfile.lock" }}
33
+ paths:
34
+ - vendor/bundle
35
+
36
+ - run:
37
+ name: Create ~/.netrc
38
+ command: |
39
+ cp spec/fixtures/.netrc ~/
40
+ chmod 0600 ~/.netrc
41
+
42
+ - run:
43
+ name: Run tests
44
+ command: |
45
+ mkdir /tmp/test-results
46
+ TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"
47
+
48
+ bundle exec rspec --format progress \
49
+ --format RspecJunitFormatter \
50
+ --out /tmp/test-results/rspec.xml \
51
+ --format progress \
52
+ $TEST_FILES
53
+
54
+ - store_test_results:
55
+ path: /tmp/test-results
56
+
57
+ - store_artifacts:
58
+ path: /tmp/test-results
59
+ destination: test-results
data/.gitignore CHANGED
@@ -1,6 +1,5 @@
1
1
  /.bundle/
2
2
  /.yardoc
3
- /Gemfile.lock
4
3
  /_yardoc/
5
4
  /coverage/
6
5
  /doc/
data/Gemfile CHANGED
@@ -1,4 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in learn.gemspec
4
3
  gemspec
4
+
5
+ group :test do
6
+ gem 'rspec_junit_formatter', '~> 0.4.1'
7
+ end
@@ -0,0 +1,71 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ learn-test (2.7.0)
5
+ colorize (~> 0.8.1)
6
+ crack (~> 0.4.3)
7
+ faraday (~> 0.9)
8
+ git (~> 1.2)
9
+ jasmine (~> 2.6.0, >= 2.6.0)
10
+ jasmine-core (< 2.99.1)
11
+ netrc (~> 0.11.0)
12
+ oj (~> 2.9)
13
+ rainbow (= 1.99.2)
14
+ rspec (~> 3.0)
15
+ webrick (~> 1.3.1, >= 1.3.1)
16
+
17
+ GEM
18
+ remote: https://rubygems.org/
19
+ specs:
20
+ colorize (0.8.1)
21
+ crack (0.4.3)
22
+ safe_yaml (~> 1.0.0)
23
+ diff-lcs (1.4.4)
24
+ faraday (0.17.3)
25
+ multipart-post (>= 1.2, < 3)
26
+ git (1.7.0)
27
+ rchardet (~> 1.8)
28
+ jasmine (2.6.0)
29
+ jasmine-core (>= 2.6.0, < 3.0.0)
30
+ phantomjs
31
+ rack (>= 1.2.1)
32
+ rake
33
+ jasmine-core (2.99.0)
34
+ multipart-post (2.1.1)
35
+ netrc (0.11.0)
36
+ oj (2.18.5)
37
+ phantomjs (2.1.1.0)
38
+ rack (2.2.3)
39
+ rainbow (1.99.2)
40
+ rake (13.0.1)
41
+ rchardet (1.8.0)
42
+ rspec (3.9.0)
43
+ rspec-core (~> 3.9.0)
44
+ rspec-expectations (~> 3.9.0)
45
+ rspec-mocks (~> 3.9.0)
46
+ rspec-core (3.9.2)
47
+ rspec-support (~> 3.9.3)
48
+ rspec-expectations (3.9.2)
49
+ diff-lcs (>= 1.2.0, < 2.0)
50
+ rspec-support (~> 3.9.0)
51
+ rspec-mocks (3.9.1)
52
+ diff-lcs (>= 1.2.0, < 2.0)
53
+ rspec-support (~> 3.9.0)
54
+ rspec-support (3.9.3)
55
+ rspec_junit_formatter (0.4.1)
56
+ rspec-core (>= 2, < 4, != 2.12.0)
57
+ safe_yaml (1.0.5)
58
+ webrick (1.3.1)
59
+
60
+ PLATFORMS
61
+ ruby
62
+
63
+ DEPENDENCIES
64
+ bundler (~> 2.1.4)
65
+ learn-test!
66
+ rake (~> 13.0.1)
67
+ rspec (~> 3.8)
68
+ rspec_junit_formatter (~> 0.4.1)
69
+
70
+ BUNDLED WITH
71
+ 2.1.4
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014-2015 Flatiron School
1
+ Copyright (c) 2014-2018 Flatiron School
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # learn-test
2
2
 
3
- Runs RSpec, Jasmine, and Python Unit Test test suites and uploads the results to Learn.
3
+ Runs RSpec, Jasmine, and Python Pytest test suites and uploads the results to Learn.
4
4
 
5
5
  ## Installation
6
6
 
@@ -22,7 +22,7 @@ And then execute:
22
22
 
23
23
  ## Usage
24
24
 
25
- From within a directory with an RSpec, Jasmine, Karma, Mocha, or Python Unit Test test suite, run:
25
+ From within a directory with an RSpec, Jasmine, Karma, Mocha, or Python Pytest test suite, run:
26
26
 
27
27
  ```
28
28
  $ learn-test
@@ -35,4 +35,3 @@ $ learn-test
35
35
  3. Commit your changes (`git commit -am 'Add some feature'`)
36
36
  4. Push to the branch (`git push origin my-new-feature`)
37
37
  5. Create a new Pull Request
38
-
@@ -57,6 +57,10 @@ OptionParser.new do |opts|
57
57
  options[:fail_fast] = f
58
58
  end
59
59
 
60
+ opts.on("-e", "--example STRING", "Run examples whose full nested names include STRING (may be used more than once)") do |s|
61
+ (options[:example] ||= []) << s
62
+ end
63
+
60
64
  if ARGV.any? { |arg| arg == "init" }
61
65
  options[:init] = true
62
66
  end
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.version = LearnTest::VERSION
9
9
  spec.authors = ["Flatiron School"]
10
10
  spec.email = ["learn@flatironschool.com"]
11
- spec.summary = %q{Runs RSpec, Jasmine, Karma, Mocha, and Python Unit Test builds and pushes JSON output to Learn.}
11
+ spec.summary = %q{Runs RSpec, Jasmine, Karma, Mocha, and Python Pytest Test builds and pushes JSON output to Learn.}
12
12
  spec.homepage = "https://github.com/learn-co/learn-test"
13
13
  spec.license = "MIT"
14
14
 
@@ -18,8 +18,9 @@ Gem::Specification.new do |spec|
18
18
  spec.require_paths = ["lib", "bin"]
19
19
  spec.required_ruby_version = '>= 2.3.0'
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.7"
22
- spec.add_development_dependency "rake", "~> 10.0"
21
+ spec.add_development_dependency "bundler", "~> 2.1.4"
22
+ spec.add_development_dependency "rake", "~> 13.0.1"
23
+ spec.add_development_dependency "rspec", "~> 3.8"
23
24
  spec.add_runtime_dependency "rspec", "~> 3.0"
24
25
  spec.add_runtime_dependency "netrc", "~> 0.11.0"
25
26
  spec.add_runtime_dependency "git", "~> 1.2"
@@ -31,5 +32,4 @@ Gem::Specification.new do |spec|
31
32
  spec.add_runtime_dependency "colorize", "~> 0.8.1"
32
33
  spec.add_runtime_dependency "webrick", "~> 1.3.1", ">= 1.3.1"
33
34
  spec.add_runtime_dependency "rainbow", "= 1.99.2"
34
- spec.add_runtime_dependency "selenium-webdriver", "~> 2.52.0", '>= 2.52.0'
35
35
  end
@@ -17,14 +17,13 @@ require_relative 'learn_test/dependency'
17
17
  require_relative 'learn_test/strategy'
18
18
  require_relative 'learn_test/js_strategy'
19
19
  require_relative 'learn_test/strategies/jasmine'
20
- require_relative 'learn_test/strategies/python_unittest'
21
20
  require_relative 'learn_test/strategies/rspec'
22
21
  require_relative 'learn_test/strategies/karma'
23
22
  require_relative 'learn_test/strategies/protractor'
24
23
  require_relative 'learn_test/strategies/java_junit'
25
24
  require_relative 'learn_test/strategies/csharp_nunit'
26
25
  require_relative 'learn_test/strategies/mocha'
27
- require_relative 'learn_test/strategies/green_onion'
26
+ require_relative 'learn_test/strategies/pytest'
28
27
 
29
28
  module LearnTest
30
29
  module Dependencies
@@ -37,7 +36,6 @@ module LearnTest
37
36
  autoload :Ant, 'learn_test/dependencies/ant'
38
37
  autoload :Imagemagick, 'learn_test/dependencies/imagemagick'
39
38
  autoload :SeleniumServer, 'learn_test/dependencies/selenium_server'
40
- autoload :Firefox, 'learn_test/dependencies/firefox'
41
- autoload :GreenOnion, 'learn_test/dependencies/green_onion'
39
+ autoload :Pytest, 'learn_test/dependencies/pytest'
42
40
  end
43
41
  end
@@ -3,7 +3,7 @@ require 'json'
3
3
 
4
4
  module LearnTest
5
5
  class Client
6
- SERVICE_URL = 'http://ironbroker-v2.flatironschool.com'.freeze
6
+ SERVICE_URL = ENV.fetch('IRONBROKER_URL', 'http://ironbroker-v2.flatironschool.com').freeze
7
7
 
8
8
  def initialize(service_url = SERVICE_URL)
9
9
  @conn = Faraday.new(url: service_url) do |faraday|
@@ -8,11 +8,15 @@ module LearnTest
8
8
  [:dependencies, :devDependencies].any? { |key| js_package[key] && js_package[key][dep] }
9
9
  end
10
10
 
11
+ def modules_missing?(module_names)
12
+ module_names.any? { |name| !File.exist?("node_modules/#{name}") }
13
+ end
14
+
11
15
  def missing_dependencies?
12
16
  return true if !File.exist?("node_modules")
13
-
14
- [:dependencies, :devDependencies, :peerDependencies].any? do |d|
15
- (js_package[d] || {}).any? { |p, v| !File.exist?("node_modules/#{p}") }
17
+ [:dependencies, :devDependencies, :peerDependencies].any? do |dep_group|
18
+ modules = js_package[dep_group] || {}
19
+ modules_missing?(modules.keys)
16
20
  end
17
21
  end
18
22
 
@@ -6,14 +6,14 @@ module LearnTest
6
6
  begin
7
7
  repo = Git.open(FileUtils.pwd)
8
8
  rescue
9
- puts "You don't appear to be in a Learn lesson's directory. Please cd to an appropriate directory and try again."
9
+ puts "You don't appear to be in a Learn lesson's directory. Please enter 'learn open' or cd to an appropriate directory and try again."
10
10
  die
11
11
  end
12
12
 
13
13
  if url = repo.remote.url
14
14
  url.match(/(?:https?:\/\/|git@).*\/(.+?)(?:\.git)?$/)[1]
15
15
  else
16
- puts "You don't appear to be in a Learn lesson's directory. Please cd to an appropriate directory and try again."
16
+ puts "You don't appear to be in a Learn lesson's directory. Please enter 'learn open' or cd to an appropriate directory and try again."
17
17
  die
18
18
  end
19
19
  end
@@ -23,4 +23,3 @@ module LearnTest
23
23
  end
24
24
  end
25
25
  end
26
-
@@ -51,13 +51,12 @@ module LearnTest
51
51
  [
52
52
  LearnTest::Strategies::CSharpNunit,
53
53
  LearnTest::Strategies::Jasmine,
54
- LearnTest::Strategies::GreenOnion,
55
54
  LearnTest::Strategies::Rspec,
56
55
  LearnTest::Strategies::Karma,
57
56
  LearnTest::Strategies::Protractor,
58
57
  LearnTest::Strategies::JavaJunit,
59
58
  LearnTest::Strategies::Mocha,
60
- LearnTest::Strategies::PythonUnittest,
59
+ LearnTest::Strategies::Pytest,
61
60
  ]
62
61
  end
63
62
 
@@ -0,0 +1,85 @@
1
+ require 'crack'
2
+ require_relative 'pytest/requirements_checker'
3
+
4
+ module LearnTest
5
+ module Strategies
6
+ class Pytest < LearnTest::Strategy
7
+
8
+ def service_endpoint
9
+ '/e/flatiron_pytest'
10
+ end
11
+
12
+ def detect
13
+ test_files.count > 0
14
+ end
15
+
16
+ def check_dependencies
17
+ LearnTest::Pytest::RequirementsChecker.check_installation
18
+ end
19
+
20
+ def run
21
+ system("python -m pytest #{options[:argv].join(' ')} --junitxml='./.results.xml'")
22
+ end
23
+
24
+ def output
25
+ @output ||= Crack::XML.parse(File.read('.results.xml'))["testsuite"]
26
+ end
27
+
28
+ def test_files
29
+ # pytest will run all files of the form test_*.py or *_test.py
30
+ @test_files ||= Dir.glob("**/test_*.py") + Dir.glob("**/*_test.py")
31
+ end
32
+
33
+ def results
34
+ failed_count = output["failures"].to_i + output["errors"].to_i
35
+ skipped_count = output["skips"].to_i
36
+ passed_count = output["tests"].to_i - failed_count - skipped_count
37
+ {
38
+ username: username,
39
+ github_user_id: user_id,
40
+ learn_oauth_token: learn_oauth_token,
41
+ repo_name: runner.repo,
42
+ build: {
43
+ test_suite: [{
44
+ framework: 'pytest',
45
+ formatted_output: output.to_json,
46
+ duration: output["time"]
47
+ }]
48
+ },
49
+ examples: output["tests"].to_i,
50
+ passing_count: passed_count,
51
+ pending_count: skipped_count,
52
+ failure_count: failed_count,
53
+ failure_descriptions: concat_failure_descriptions
54
+ }
55
+ end
56
+
57
+ def cleanup
58
+ FileUtils.rm('.results.xml')
59
+ end
60
+
61
+ private
62
+
63
+ def calculate_duration
64
+ output[:results].map do |example|
65
+ example[:time]
66
+ end.inject(:+)
67
+ end
68
+
69
+ def concat_failure_descriptions
70
+ # if there is a single test the `testcase` xml parse turns out a hash
71
+ # instead of an array with a single hash. this will make sure single
72
+ # tests have the same output structure (Array) as multiple tests
73
+ output["testcase"] = [output["testcase"]].flatten
74
+
75
+ output["testcase"].reduce([]) do |errors, example|
76
+ if example.has_key?("failure")
77
+ errors << example.map{|k, v| "#{k}: #{v}"}
78
+ end
79
+ errors
80
+ end
81
+ end
82
+
83
+ end
84
+ end
85
+ end
@@ -1,35 +1,28 @@
1
1
  require 'open3'
2
2
 
3
3
  module LearnTest
4
- module PythonUnittest
4
+ module Pytest
5
5
  class RequirementsChecker
6
6
  def self.check_installation
7
- new.check_installation
8
- end
9
-
10
- def check_installation
11
7
  PythonChecker.check
12
8
  PipChecker.check
9
+ PytestChecker.check
13
10
  end
14
11
  end
15
12
 
16
13
  class PythonChecker
17
14
  def self.check
18
- new.check
19
- end
20
-
21
- def check
22
- if !python_installed? || !correct_python_version?
15
+ if !self.python_installed? || !self.correct_python_version?
23
16
  puts "Please install python 2.7.x or 3.x.x"
24
17
  exit
25
18
  end
26
19
  end
27
20
 
28
- def python_installed?
21
+ def self.python_installed?
29
22
  !`which python`.empty?
30
23
  end
31
24
 
32
- def correct_python_version?
25
+ def self.correct_python_version?
33
26
  output = Open3.popen2e('python', '--version')
34
27
  version = output[1].read.strip
35
28
  !!version.match(/ 2.7.*| 3.*/)
@@ -38,20 +31,29 @@ module LearnTest
38
31
 
39
32
  class PipChecker
40
33
  def self.check
41
- new.check
42
- end
43
-
44
- def check
45
- if !pip_installed?
34
+ if !self.pip_installed?
46
35
  puts "Please ensure pip is installed"
47
36
  exit
48
37
  end
49
38
  end
50
39
 
51
- def pip_installed?
40
+ def self.pip_installed?
52
41
  !`which pip`.empty?
53
42
  end
54
43
  end
44
+
45
+ class PytestChecker
46
+ def self.check
47
+ if !self.pytest_installed?
48
+ puts "Please ensure pytest is installed"
49
+ exit
50
+ end
51
+ end
52
+
53
+ def self.pytest_installed?
54
+ !`which pytest`.empty?
55
+ end
56
+ end
57
+
55
58
  end
56
59
  end
57
-
@@ -25,6 +25,10 @@ module LearnTest
25
25
  argv << '--fail-fast'
26
26
  end
27
27
 
28
+ if example_option_present?
29
+ argv << options[:example].map{|e| "--example #{e}"}.join(" ")
30
+ end
31
+
28
32
  # Don't pass the test/local flag from learn binary to rspec runner.
29
33
  argv.delete("--test")
30
34
  argv.delete("-t")
@@ -83,6 +87,10 @@ module LearnTest
83
87
  options[:fail_fast]
84
88
  end
85
89
 
90
+ def example_option_present?
91
+ options[:example]
92
+ end
93
+
86
94
  def dot_rspec
87
95
  @dot_rspec ||= File.readlines('.rspec').map(&:strip) if File.exist?('.rspec')
88
96
  end
@@ -7,7 +7,7 @@ module LearnTest
7
7
 
8
8
  if !LearnTest::LearnOauthTokenParser.get_learn_oauth_token && (!username || user_id == 'none')
9
9
  print "Enter your github username: "
10
- username = gets.strip
10
+ username = $stdin.gets.strip
11
11
  user_id = LearnTest::GithubInteractor.get_user_id_for(username)
12
12
  parser.write(username, user_id)
13
13
  end
@@ -1,3 +1,3 @@
1
1
  module LearnTest
2
- VERSION = '2.5.5'
2
+ VERSION = '3.0.0'
3
3
  end
@@ -1,10 +1,35 @@
1
1
  describe "Running a RSpec Unit Test" do
2
+ before(:all) do
3
+ # While it doesn't cause these tests to fail, nasty messages occur (and more)
4
+ # when either a ~/.netrc entry or file itself doesn't exist. This aims to correct that,
5
+ # and will only ever be called once.
6
+
7
+ LearnTest::UsernameParser.get_username
8
+ end
9
+
2
10
  context 'a basic rspec unit test' do
3
11
  it 'runs the spec with 0 failures' do
4
12
  output = `cd ./spec/fixtures/rspec-unit-spec && ./../../../bin/learn-test --local --test`
5
13
 
6
- expect(output).to include('1 example, 0 failures')
14
+ expect(output).to include('3 examples, 0 failures')
7
15
  expect(output).to_not include('1 failures')
8
16
  end
9
17
  end
18
+
19
+ context 'with the --example flag' do
20
+ it 'runs only the appropriate tests' do
21
+ output = `cd ./spec/fixtures/rspec-unit-spec && ./../../../bin/learn-test --local --test --example multiple`
22
+
23
+ expect(output).to include('1 example, 0 failures')
24
+ expect(output).to_not include('2 examples')
25
+ end
26
+
27
+ it 'accepts multiple examples' do
28
+ output = `cd ./spec/fixtures/rspec-unit-spec && ./../../../bin/learn-test --local --test --example multiple --example accepts`
29
+
30
+ expect(output).to include('2 examples, 0 failures')
31
+ expect(output).to_not include('3 examples')
32
+ expect(output).to_not include('1 example')
33
+ end
34
+ end
10
35
  end
@@ -0,0 +1,3 @@
1
+ machine flatiron-push
2
+ login tmilewski
3
+ password 26691
@@ -4,4 +4,12 @@ describe Dog do
4
4
  it 'runs the spec spec correctly' do
5
5
  expect(subject).to be_an_instance_of(Dog)
6
6
  end
7
+
8
+ it 'has multiple specs' do
9
+ expect(subject).not_to be_an_instance_of(String)
10
+ end
11
+
12
+ it 'accepts more than one example' do
13
+ expect(subject).not_to be_an_instance_of(String)
14
+ end
7
15
  end
@@ -0,0 +1,61 @@
1
+ describe LearnTest::UsernameParser do
2
+ subject { LearnTest::UsernameParser }
3
+
4
+ let(:dbl) { instance_double(LearnTest::NetrcInteractor) }
5
+
6
+ let!(:username) { 'learn-co' }
7
+ let!(:user_id) { '12345' }
8
+ let!(:token) { 'abc123' }
9
+
10
+ context 'user details are stored in ~/.netrc' do
11
+ context 'username/password' do
12
+ it 'should return a username' do
13
+ expect(LearnTest::LearnOauthTokenParser).to receive(:get_learn_oauth_token).and_return(token)
14
+
15
+ expect(LearnTest::NetrcInteractor).to receive(:new).and_return(dbl)
16
+ expect(dbl).to receive(:username).and_return(username)
17
+ expect(dbl).to receive(:user_id).and_return(user_id)
18
+
19
+ expect(dbl).to_not receive(:write)
20
+
21
+ expect(subject.get_username).to eq(username)
22
+ end
23
+ end
24
+
25
+ context 'oauth token' do
26
+ it 'should return a username' do
27
+ expect(LearnTest::LearnOauthTokenParser).to receive(:get_learn_oauth_token).and_return(token)
28
+
29
+ expect(LearnTest::NetrcInteractor).to receive(:new).and_return(dbl)
30
+ expect(dbl).to receive(:username).and_return(nil)
31
+ expect(dbl).to receive(:user_id).and_return(nil)
32
+
33
+ expect(dbl).to_not receive(:write)
34
+
35
+ expect(subject.get_username).to eq(nil)
36
+ end
37
+ end
38
+ end
39
+
40
+ context 'user details are not stored in ~/.netrc' do
41
+ it 'should ask for and store a username' do
42
+ @original_stdout = $stdout
43
+ $stdout = File.open(File::NULL, 'w')
44
+
45
+ expect(LearnTest::LearnOauthTokenParser).to receive(:get_learn_oauth_token).and_return(nil)
46
+
47
+ expect(LearnTest::NetrcInteractor).to receive(:new).and_return(dbl)
48
+ expect(dbl).to receive(:username).and_return(nil)
49
+ expect(dbl).to receive(:user_id).and_return(nil)
50
+
51
+ expect($stdin).to receive(:gets).and_return(username)
52
+ expect(LearnTest::GithubInteractor).to receive(:get_user_id_for).with(username).and_return(user_id)
53
+ expect(dbl).to receive(:write).with(username, user_id)
54
+
55
+ expect(subject.get_username).to eq(username)
56
+
57
+ $stdout = @original_stdout
58
+ @original_stdout = nil
59
+ end
60
+ end
61
+ end
@@ -16,44 +16,47 @@ describe LearnTest::Strategies::Mocha do
16
16
  }
17
17
  }
18
18
  end
19
+
19
20
  let(:runner) { double("Runner", options: {}) }
20
21
  let(:strategy) { LearnTest::Strategies::Mocha.new(runner) }
21
22
 
22
- it "returns true if no node_modules directory" do
23
- expect(File).to receive(:exists?).with("node_modules") { false }
24
-
25
- expect(strategy.missing_dependencies?(package)).to eq(true)
23
+ context "node_modules/ does not exist" do
24
+ it "returns true" do
25
+ allow(File).to receive(:exist?).with("node_modules").and_return(false)
26
+ expect(strategy.missing_dependencies?).to eq(true)
27
+ end
26
28
  end
27
29
 
28
- context "node_modules exists" do
30
+
31
+ context "node_modules/ exists" do
29
32
  before(:each) do
30
- allow(File).to receive(:exists?) { true }
33
+ allow(File).to receive(:exist?).and_return(true)
34
+ allow(strategy).to receive(:js_package).and_return(package)
31
35
  end
32
36
 
33
37
  it "returns true if missing a dependency" do
34
- expect(File).to receive(:exists?).with("node_modules/dep1") { true }
35
- expect(File).to receive(:exists?).with("node_modules/dep2") { false }
36
- expect(strategy.missing_dependencies?(package)).to eq(true)
38
+ allow(File).to receive(:exist?).with("node_modules/dep2").and_return(false)
39
+ expect(strategy.missing_dependencies?).to eq(true)
37
40
  end
38
41
 
39
42
  it "returns true if missing a devDependency" do
40
- expect(File).to receive(:exists?).with("node_modules/devDep1") { true }
41
- expect(File).to receive(:exists?).with("node_modules/devDep2") { false }
42
- expect(strategy.missing_dependencies?(package)).to eq(true)
43
+ allow(File).to receive(:exist?).with("node_modules/devDep2").and_return(false)
44
+ expect(strategy.missing_dependencies?).to eq(true)
43
45
  end
44
46
 
45
47
  it "returns true if missing a peerDependency" do
46
- expect(File).to receive(:exists?).with("node_modules/peerDep1") { true }
47
- expect(File).to receive(:exists?).with("node_modules/peerDep2") { false }
48
- expect(strategy.missing_dependencies?(package)).to eq(true)
48
+ allow(File).to receive(:exist?).with("node_modules/peerDep2").and_return(false)
49
+ expect(strategy.missing_dependencies?).to eq(true)
49
50
  end
50
51
 
51
52
  it "returns false if missing no dependencies" do
52
- expect(strategy.missing_dependencies?(package)).to eq(false)
53
+ allow(File).to receive(:exist?).and_return(true)
54
+ expect(strategy.missing_dependencies?).to eq(false)
53
55
  end
54
56
 
55
57
  it "returns false if there are no dependencies" do
56
- expect(strategy.missing_dependencies?({})).to eq(false)
58
+ allow(strategy).to receive(:js_package).and_return({})
59
+ expect(strategy.missing_dependencies?).to eq(false)
57
60
  end
58
61
  end
59
62
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: learn-test
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.5
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Flatiron School
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-19 00:00:00.000000000 Z
11
+ date: 2020-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,28 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: 2.1.4
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: 2.1.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: 13.0.1
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: 13.0.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.8'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.8'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rspec
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -204,26 +218,6 @@ dependencies:
204
218
  - - '='
205
219
  - !ruby/object:Gem::Version
206
220
  version: 1.99.2
207
- - !ruby/object:Gem::Dependency
208
- name: selenium-webdriver
209
- requirement: !ruby/object:Gem::Requirement
210
- requirements:
211
- - - "~>"
212
- - !ruby/object:Gem::Version
213
- version: 2.52.0
214
- - - ">="
215
- - !ruby/object:Gem::Version
216
- version: 2.52.0
217
- type: :runtime
218
- prerelease: false
219
- version_requirements: !ruby/object:Gem::Requirement
220
- requirements:
221
- - - "~>"
222
- - !ruby/object:Gem::Version
223
- version: 2.52.0
224
- - - ">="
225
- - !ruby/object:Gem::Version
226
- version: 2.52.0
227
221
  description:
228
222
  email:
229
223
  - learn@flatironschool.com
@@ -232,9 +226,11 @@ executables:
232
226
  extensions: []
233
227
  extra_rdoc_files: []
234
228
  files:
229
+ - ".circleci/config.yml"
235
230
  - ".gitignore"
236
231
  - ".rspec"
237
232
  - Gemfile
233
+ - Gemfile.lock
238
234
  - LICENSE.txt
239
235
  - README.md
240
236
  - Rakefile
@@ -244,8 +240,6 @@ files:
244
240
  - lib/learn_test/client.rb
245
241
  - lib/learn_test/dependencies/ant.rb
246
242
  - lib/learn_test/dependencies/csharp.rb
247
- - lib/learn_test/dependencies/firefox.rb
248
- - lib/learn_test/dependencies/green_onion.rb
249
243
  - lib/learn_test/dependencies/imagemagick.rb
250
244
  - lib/learn_test/dependencies/java.rb
251
245
  - lib/learn_test/dependencies/karma.rb
@@ -263,7 +257,6 @@ files:
263
257
  - lib/learn_test/reporter.rb
264
258
  - lib/learn_test/runner.rb
265
259
  - lib/learn_test/strategies/csharp_nunit.rb
266
- - lib/learn_test/strategies/green_onion.rb
267
260
  - lib/learn_test/strategies/jasmine.rb
268
261
  - lib/learn_test/strategies/jasmine/boot.js
269
262
  - lib/learn_test/strategies/jasmine/console.js
@@ -289,9 +282,8 @@ files:
289
282
  - lib/learn_test/strategies/karma/karma.conf.js
290
283
  - lib/learn_test/strategies/mocha.rb
291
284
  - lib/learn_test/strategies/protractor.rb
292
- - lib/learn_test/strategies/python_unittest.rb
293
- - lib/learn_test/strategies/python_unittest/nose_installer.rb
294
- - lib/learn_test/strategies/python_unittest/requirements_checker.rb
285
+ - lib/learn_test/strategies/pytest.rb
286
+ - lib/learn_test/strategies/pytest/requirements_checker.rb
295
287
  - lib/learn_test/strategies/rspec.rb
296
288
  - lib/learn_test/strategy.rb
297
289
  - lib/learn_test/user_id_parser.rb
@@ -304,6 +296,7 @@ files:
304
296
  - node_modules/karma-json-reporter/package.json
305
297
  - spec/features/jasmine_jquery_fixtures_spec.rb
306
298
  - spec/features/rspec_unit_spec.rb
299
+ - spec/fixtures/.netrc
307
300
  - spec/fixtures/jasmine-jquery-fixtures/index.html
308
301
  - spec/fixtures/jasmine-jquery-fixtures/requires.yml
309
302
  - spec/fixtures/jasmine-jquery-fixtures/spec/jasmine-jquery-fixtures-spec.js
@@ -312,6 +305,7 @@ files:
312
305
  - spec/fixtures/rspec-unit-spec/spec/dog_spec.rb
313
306
  - spec/fixtures/rspec-unit-spec/spec/spec_helper.rb
314
307
  - spec/learn_test/reporter_spec.rb
308
+ - spec/learn_test/username_parser_spec.rb
315
309
  - spec/lib/learn_test/strategies/mocha_spec.rb
316
310
  - spec/repo_parser_spec.rb
317
311
  - spec/spec_helper.rb
@@ -335,15 +329,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
335
329
  - !ruby/object:Gem::Version
336
330
  version: '0'
337
331
  requirements: []
338
- rubyforge_project:
339
- rubygems_version: 2.6.14
332
+ rubygems_version: 3.1.2
340
333
  signing_key:
341
334
  specification_version: 4
342
- summary: Runs RSpec, Jasmine, Karma, Mocha, and Python Unit Test builds and pushes
335
+ summary: Runs RSpec, Jasmine, Karma, Mocha, and Python Pytest Test builds and pushes
343
336
  JSON output to Learn.
344
337
  test_files:
345
338
  - spec/features/jasmine_jquery_fixtures_spec.rb
346
339
  - spec/features/rspec_unit_spec.rb
340
+ - spec/fixtures/.netrc
347
341
  - spec/fixtures/jasmine-jquery-fixtures/index.html
348
342
  - spec/fixtures/jasmine-jquery-fixtures/requires.yml
349
343
  - spec/fixtures/jasmine-jquery-fixtures/spec/jasmine-jquery-fixtures-spec.js
@@ -352,6 +346,7 @@ test_files:
352
346
  - spec/fixtures/rspec-unit-spec/spec/dog_spec.rb
353
347
  - spec/fixtures/rspec-unit-spec/spec/spec_helper.rb
354
348
  - spec/learn_test/reporter_spec.rb
349
+ - spec/learn_test/username_parser_spec.rb
355
350
  - spec/lib/learn_test/strategies/mocha_spec.rb
356
351
  - spec/repo_parser_spec.rb
357
352
  - spec/spec_helper.rb
@@ -1,26 +0,0 @@
1
- require 'selenium-webdriver'
2
-
3
- module LearnTest
4
- module Dependencies
5
- class Firefox < LearnTest::Dependency
6
- def missing?
7
- begin
8
- Selenium::WebDriver::Firefox::Binary.path
9
-
10
- false
11
- rescue Selenium::WebDriver::Error::WebDriverError
12
- true
13
- end
14
- end
15
-
16
- def install
17
- die('Please download and install Firefox: https://www.mozilla.org/en-US/firefox'.red)
18
- end
19
-
20
- def die(message)
21
- puts message
22
- exit
23
- end
24
- end
25
- end
26
- end
@@ -1,14 +0,0 @@
1
- module LearnTest
2
- module Dependencies
3
- class GreenOnion < LearnTest::Dependency
4
- def missing?
5
- `gem list | grep green_onion`.empty?
6
- end
7
-
8
- def install
9
- print_installing('green_onion')
10
- run_install('gem install green_onion -v 0.1.4')
11
- end
12
- end
13
- end
14
- end
@@ -1,57 +0,0 @@
1
- module LearnTest
2
- module Strategies
3
- class GreenOnion < LearnTest::Strategy
4
- attr_reader :rspec_runner
5
-
6
- def initialize(runner)
7
- @rspec_runner = Strategies::Rspec.new(runner)
8
- super
9
- end
10
-
11
- def service_endpoint
12
- '/e/flatiron_rspec'
13
- end
14
-
15
- def detect
16
- runner.files.include?('.learn') && green_onion_lab?
17
- end
18
-
19
- def configure
20
- rspec_runner.configure
21
- end
22
-
23
- def check_dependencies
24
- Dependencies::Imagemagick.new.execute
25
- Dependencies::SeleniumServer.new.execute
26
- Dependencies::GreenOnion.new.execute
27
- Dependencies::Firefox.new.execute
28
- end
29
-
30
- def run
31
- rspec_runner.run
32
- end
33
-
34
- def output
35
- rspec_runner.output
36
- end
37
-
38
- def results
39
- rspec_runner.results
40
- end
41
-
42
- def cleanup
43
- rspec_runner.cleanup
44
- end
45
-
46
- private
47
-
48
- def green_onion_lab?
49
- yaml['tests'] && yaml['tests'].include?('green_onion')
50
- end
51
-
52
- def yaml
53
- @yaml ||= YAML.load(File.read('.learn'))
54
- end
55
- end
56
- end
57
- end
@@ -1,72 +0,0 @@
1
- require_relative 'python_unittest/requirements_checker'
2
- require_relative 'python_unittest/nose_installer'
3
-
4
- module LearnTest
5
- module Strategies
6
- class PythonUnittest < LearnTest::Strategy
7
- def service_endpoint
8
- '/e/flatiron_unittest'
9
- end
10
-
11
- def detect
12
- test_files.any? {|f| f.match(/.*\.py$/) }
13
- end
14
-
15
- def check_dependencies
16
- LearnTest::PythonUnittest::RequirementsChecker.check_installation
17
- LearnTest::PythonUnittest::NoseInstaller.install
18
- end
19
-
20
- def run
21
- system("nosetests #{options[:argv].join(' ')} --verbose --with-json --json-file='./.results.json'")
22
- end
23
-
24
- def output
25
- @output ||= Oj.load(File.read('.results.json'), symbol_keys: true)
26
- end
27
-
28
- def test_files
29
- @test_files ||= Dir.glob("**/*_test.py")
30
- end
31
-
32
- def results
33
- {
34
- username: username,
35
- github_user_id: user_id,
36
- learn_oauth_token: learn_oauth_token,
37
- repo_name: runner.repo,
38
- build: {
39
- test_suite: [{
40
- framework: 'unittest',
41
- formatted_output: output,
42
- duration: calculate_duration
43
- }]
44
- },
45
- examples: output[:stats][:total],
46
- passing_count: output[:stats][:passes],
47
- pending_count: output[:stats][:skipped],
48
- failure_count: output[:stats][:errors],
49
- failure_descriptions: concat_failure_descriptions
50
- }
51
- end
52
-
53
- def cleanup
54
- FileUtils.rm('.results.json')
55
- end
56
-
57
- private
58
-
59
- def calculate_duration
60
- output[:results].map do |example|
61
- example[:time]
62
- end.inject(:+)
63
- end
64
-
65
- def concat_failure_descriptions
66
- output[:results].select do |example|
67
- example[:type] == 'failure'
68
- end.map { |ex| ex[:tb] }.join(';')
69
- end
70
- end
71
- end
72
- end
@@ -1,35 +0,0 @@
1
- module LearnTest
2
- module PythonUnittest
3
- class NoseInstaller
4
- def self.install
5
- new.install
6
- end
7
-
8
- def install
9
- install_nose
10
- install_nose_json
11
- end
12
-
13
- def install_nose
14
- if !nose_installed?
15
- `easy_install nose`
16
- end
17
- end
18
-
19
- def nose_installed?
20
- !`which nosetests`.empty?
21
- end
22
-
23
- def install_nose_json
24
- if !nose_json_installed?
25
- `pip install nose-json`
26
- end
27
- end
28
-
29
- def nose_json_installed?
30
- !`pip show nose-json`.empty?
31
- end
32
- end
33
- end
34
- end
35
-