hot_or_not 0.1.8 → 0.1.9

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.8
1
+ 0.1.9
data/bin/hot_or_not CHANGED
@@ -5,16 +5,21 @@ require File.dirname(__FILE__) + '/../lib/hot_or_not'
5
5
  require 'optparse'
6
6
 
7
7
  defaults = {
8
- :output_directory => 'test_results'
8
+ :output_directory => 'test_results',
9
+ :test_names => :all
9
10
  }
10
11
 
11
12
  options = {}
12
13
  parser = ::OptionParser.new do |opts|
13
14
  opts.banner = "Usage: hot_or_not [options] URL_FILE"
14
- opts.on("-o", "--output-dir", "Ouput directory. DEFAULT: #{defaults[:output_directory]}") do |d|
15
+ opts.on("-o", "--output-dir [DIRECTORY]", "Ouput base directory. DEFAULT: #{defaults[:output_directory]}") do |d|
15
16
  options[:output_directory] = d
16
17
  end
17
18
 
19
+ opts.on('-n', '--name [NAMES]', "Test names to run. DEFAULT: all") do |test_names|
20
+ options[:test_names] = test_names.split(',')
21
+ end
22
+
18
23
  opts.on_tail("--example-file", "Output contents of example file") do
19
24
  puts
20
25
  puts File.read(File.dirname(__FILE__) + '/../test/data/simple_urls.yml')
@@ -43,5 +48,8 @@ unless File.exists? yaml_file
43
48
  exit
44
49
  end
45
50
 
46
- announcer = HotOrNot::ConsoleAnnouncer.new options[:output_directory]
47
- HotOrNot::Runner.run_from(yaml_file, announcer).run!
51
+ suite_name = File.basename(yaml_file).gsub('.yml', '').gsub('.erb', '')
52
+ output_dir = File.join options[:output_directory], suite_name
53
+
54
+ announcer = HotOrNot::ConsoleAnnouncer.new output_dir
55
+ HotOrNot::Runner.run_from(yaml_file, announcer).run! options[:test_names]
@@ -1,5 +1,6 @@
1
1
  module HotOrNot
2
2
  class ComparisonResult
3
+ extend Forwardable
3
4
 
4
5
  class << self
5
6
  def for(compare_url)
@@ -10,6 +11,7 @@ module HotOrNot
10
11
  end
11
12
 
12
13
  attr_reader :message
14
+ def_delegators :@compare_url, :short_name
13
15
 
14
16
  def initialize(compare_url, side_a_results, side_b_results)
15
17
  @compare_url, @side_a_results, @side_b_results = compare_url, side_a_results, side_b_results
@@ -8,9 +8,11 @@ module HotOrNot
8
8
  @urls, @announcer = urls, announcer
9
9
  end
10
10
 
11
- def run!
11
+ def run!(to_run = :all)
12
+ @to_run = to_run
12
13
  @announcer.starting
13
14
  @urls.each do |url|
15
+ next unless should_run? url
14
16
  result = ComparisonResult.for url
15
17
  if result.success?
16
18
  @announcer.announce_success result
@@ -22,5 +24,13 @@ module HotOrNot
22
24
  end
23
25
  @announcer.ending
24
26
  end
27
+
28
+ private
29
+ def should_run?(url)
30
+ return true if @to_run == :all
31
+ Array(@to_run).any? do |to_run|
32
+ url.full_name == to_run || url.short_name == to_run
33
+ end
34
+ end
25
35
  end
26
36
  end
data/test/runner_test.rb CHANGED
@@ -2,39 +2,81 @@ require File.expand_path(File.dirname(__FILE__)) + '/test_helper'
2
2
 
3
3
  module HotOrNot
4
4
  class RunnerTest < Test::Unit::TestCase
5
+
5
6
  def initialize(*args)
6
7
  @announcer = Class.new do
7
8
  include Announcer
8
9
 
9
10
  attr_reader :messages
10
11
  def initialize
11
- @messages = {}
12
+ @messages = Hash.new { |hash, key| hash[key] = [] }
12
13
  end
13
14
 
14
15
  def starting
15
- @messages[:starting] = true
16
+ @messages[:starting] << :starting
16
17
  end
17
18
 
18
19
  def ending
19
- @messages[:ending] = true
20
+ @messages[:ending] << :ending
20
21
  end
21
22
 
22
23
  def announce_success(result)
23
- @messages[:success] = true
24
+ @messages[:success] << result.short_name
24
25
  end
25
26
 
26
27
  def announce_failure(result)
27
- @messages[:failure] = true
28
+ @messages[:failure] << result.short_name
28
29
  end
29
30
 
30
31
  def announce_error(result)
31
- @messages[:error] = true
32
+ @messages[:error] << result.short_name
32
33
  end
33
34
  end.new
34
35
 
35
36
  super
36
37
  end
37
38
 
39
+ context "running" do
40
+
41
+ context "all" do
42
+ setup do
43
+ @url1 = mock_compare_url('Foo', '/api/foo', 'foo', 'foo')
44
+ @url2 = mock_compare_url('Bar', '/api/bar', 'bar', 'bar')
45
+ @urls = [@url1, @url2]
46
+ end
47
+
48
+ should "if nothing passed in" do
49
+ Runner.new(@urls, @announcer).run!
50
+ assert_ran @announcer, @url1.full_name, @url2.full_name
51
+ end
52
+
53
+ should "if :all passed in" do
54
+ Runner.new(@urls, @announcer).run! :all
55
+ assert_ran @announcer, @url1.full_name, @url2.full_name
56
+ end
57
+
58
+ should "run all specified tests" do
59
+ Runner.new(@urls, @announcer).run! @urls.map(&:short_name)
60
+ assert_ran @announcer, @url1.full_name, @url2.full_name
61
+ end
62
+ end
63
+
64
+ context "one" do
65
+ setup do
66
+ @url1 = mock_compare_url('Foo', '/api/foo', 'foo', 'foo')
67
+ @url2 = CompareUrl.new('Bar', '/api/bar', 'bar', 'bar')
68
+ @urls = [@url1, @url2]
69
+ end
70
+
71
+ should "only run specified test" do
72
+ Runner.new(@urls, @announcer).run! @url1.full_name
73
+
74
+ assert_ran @announcer, @url1.full_name
75
+ assert_not_ran @announcer, @url2.full_name
76
+ end
77
+ end
78
+ end
79
+
38
80
  context "successful comparison" do
39
81
  setup do
40
82
  urls = [mock_compare_url('Foo', '/api/foo', 'foo', 'foo')]
@@ -42,17 +84,17 @@ module HotOrNot
42
84
  end
43
85
 
44
86
  should "announce starting" do
45
- assert @announcer.messages[:starting]
87
+ assert_called @announcer, :starting
46
88
  end
47
89
 
48
90
  should "announce ending" do
49
- assert @announcer.messages[:ending]
91
+ assert_called @announcer, :ending
50
92
  end
51
93
 
52
94
  should "only annouce success" do
53
- assert @announcer.messages[:success]
54
- assert_false @announcer.messages[:failure]
55
- assert_false @announcer.messages[:error]
95
+ assert_called @announcer, :success
96
+ assert_not_called @announcer, :failure
97
+ assert_not_called @announcer, :error
56
98
  end
57
99
  end
58
100
 
@@ -63,17 +105,17 @@ module HotOrNot
63
105
  end
64
106
 
65
107
  should "announce starting" do
66
- assert @announcer.messages[:starting]
108
+ assert_called @announcer, :starting
67
109
  end
68
110
 
69
111
  should "announce ending" do
70
- assert @announcer.messages[:ending]
112
+ assert_called @announcer, :ending
71
113
  end
72
114
 
73
115
  should "only annouce failure" do
74
- assert @announcer.messages[:failure]
75
- assert_false @announcer.messages[:success]
76
- assert_false @announcer.messages[:error]
116
+ assert_called @announcer, :failure
117
+ assert_not_called @announcer, :success
118
+ assert_not_called @announcer, :error
77
119
  end
78
120
  end
79
121
 
@@ -84,19 +126,50 @@ module HotOrNot
84
126
  end
85
127
 
86
128
  should "announce starting" do
87
- assert @announcer.messages[:starting]
129
+ assert_called @announcer, :starting
88
130
  end
89
131
 
90
132
  should "announce ending" do
91
- assert @announcer.messages[:ending]
133
+ assert_called @announcer, :ending
92
134
  end
93
135
 
94
136
  should "only annouce error" do
95
- assert @announcer.messages[:error]
96
- assert_false @announcer.messages[:success]
97
- assert_false @announcer.messages[:failure]
137
+ assert_called @announcer, :error
138
+ assert_not_called @announcer, :success
139
+ assert_not_called @announcer, :failure
140
+ end
141
+ end
142
+
143
+ private
144
+ def assert_called(announcer, type, times = 1, msg = nil)
145
+ msg ||= "The #{type} message was not announced #{times} time(s)."
146
+ assert_equal times, announcer.messages[type.to_sym].count, msg
147
+ end
148
+
149
+ def assert_not_called(announcer, type)
150
+ assert_called announcer, type, 0, "The #{type} messages was called when it shouldn't have been"
151
+ end
152
+
153
+ def assert_ran(announcer, *tests)
154
+ tests.each do |test|
155
+ assert_equal 1, count_results(announcer, test), "Test '#{test}' was not run."
98
156
  end
99
157
  end
100
158
 
159
+ def assert_not_ran(announcer, *tests)
160
+ tests.each do |test|
161
+ assert_equal 0, count_results(announcer, test), "Test '#{test}' was run and shouldn't have been."
162
+ end
163
+ end
164
+
165
+ def count_results(announcer, test)
166
+ test_name = test.underscore.gsub(/\s+/, '_')
167
+ count = 0
168
+ count += announcer.messages[:success].count { |result_name| result_name == test_name }
169
+ count += announcer.messages[:failure].count { |result_name| result_name == test_name }
170
+ count += announcer.messages[:error].count { |result_name| result_name == test_name }
171
+ count
172
+ end
173
+
101
174
  end
102
175
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hot_or_not
3
3
  version: !ruby/object:Gem::Version
4
- hash: 11
4
+ hash: 9
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 8
10
- version: 0.1.8
9
+ - 9
10
+ version: 0.1.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - Joel Friedman