aktion_test 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +1 -1
- data/.travis.yml +2 -0
- data/CHANGELOG.md +5 -0
- data/lib/aktion_test/matchers/base.rb +34 -2
- data/lib/aktion_test/matchers/file_system/directory_contains.rb +79 -75
- data/lib/aktion_test/matchers/file_system/directory_existance.rb +46 -0
- data/lib/aktion_test/matchers/file_system/file_contains.rb +82 -81
- data/lib/aktion_test/matchers/file_system/file_existance.rb +51 -0
- data/lib/aktion_test/module/aktion_test.rb +19 -0
- data/lib/aktion_test/module/rspec.rb +15 -0
- data/lib/aktion_test/module/simplecov.rb +9 -0
- data/lib/aktion_test/spec_helper.rb +42 -0
- data/lib/aktion_test/support/class_builder.rb +29 -0
- data/lib/aktion_test/version.rb +1 -1
- data/lib/aktion_test.rb +31 -4
- data/spec/aktion_test/class_builder_spec.rb +1 -1
- data/spec/matchers/base_spec.rb +43 -35
- data/spec/matchers/directory_contains_spec.rb +4 -14
- data/spec/matchers/{be_a_directory_spec.rb → directory_existance_spec.rb} +4 -12
- data/spec/matchers/file_contains_spec.rb +3 -3
- data/spec/matchers/{be_a_file_spec.rb → file_existance_spec.rb} +4 -12
- data/spec/spec_helper.rb +1 -14
- metadata +16 -10
- data/lib/aktion_test/class_builder.rb +0 -31
- data/lib/aktion_test/matchers/file_system/be_a_directory.rb +0 -41
- data/lib/aktion_test/matchers/file_system/be_a_file.rb +0 -46
- data/lib/aktion_test/matchers/integrations/rspec.rb +0 -8
data/.rvmrc
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
|
7
7
|
# Only full ruby name is supported here, for short names use:
|
8
8
|
# echo "rvm use 1.9.3" > .rvmrc
|
9
|
-
environment_id="ruby-1.9.3-
|
9
|
+
environment_id="ruby-1.9.3-p327@aktion_test"
|
10
10
|
|
11
11
|
# Uncomment the following lines if you want to verify rvm version per project
|
12
12
|
# rvmrc_rvm_version="1.15.6 (stable)" # 1.10.1 seams as a safe start
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,12 +1,44 @@
|
|
1
1
|
module AktionTest
|
2
2
|
module Matchers
|
3
3
|
class Base
|
4
|
+
def initialize
|
5
|
+
@matches = nil
|
6
|
+
end
|
7
|
+
|
8
|
+
def matches?(subject)
|
9
|
+
return @matches unless @matches.nil?
|
10
|
+
@subject = subject
|
11
|
+
@matches = !!perform_match!
|
12
|
+
end
|
13
|
+
|
4
14
|
def failure_message
|
5
|
-
"
|
15
|
+
raise "Called failure message before determining a match from #{caller[0]}" if @matches.nil?
|
16
|
+
raise "Called failure message while the match was positive from #{caller[0]}" if @matches
|
17
|
+
"Expected #{expectation}\n#{problems_for_should}\n"
|
6
18
|
end
|
7
19
|
|
8
20
|
def negative_failure_message
|
9
|
-
"
|
21
|
+
raise "Called negative failure message before determining a match from #{caller[0]}" if @matches.nil?
|
22
|
+
raise "Called negative failure message while the match was unsucessful from #{caller[0]}" unless @matches
|
23
|
+
"Did not expect #{expectation}\n#{problems_for_should_not}\n"
|
24
|
+
end
|
25
|
+
|
26
|
+
protected
|
27
|
+
|
28
|
+
def expectation
|
29
|
+
"Override expectation to provide expectation details"
|
30
|
+
end
|
31
|
+
|
32
|
+
def problems_for_should
|
33
|
+
"Override problem_for_should to set problems in the failure message output."
|
34
|
+
end
|
35
|
+
|
36
|
+
def problems_for_should_not
|
37
|
+
"Override problem_for_should_not to set problems in the failure message output."
|
38
|
+
end
|
39
|
+
|
40
|
+
def perform_match!
|
41
|
+
raise "Override perform_match! with your custom matching logic. The subject is available through @subject"
|
10
42
|
end
|
11
43
|
end
|
12
44
|
end
|
@@ -1,98 +1,102 @@
|
|
1
1
|
module AktionTest
|
2
2
|
module Matchers
|
3
3
|
module FileSystem
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def have_tree(tree)
|
12
|
-
DirectoryContentMatcher.new(tree)
|
13
|
-
end
|
14
|
-
|
15
|
-
class DirectoryContentMatcher < Matchers::Base
|
16
|
-
def initialize(tree)
|
17
|
-
@tree = tree
|
4
|
+
module DirectoryContains
|
5
|
+
def have_file(path)
|
6
|
+
segments = path.split('/')
|
7
|
+
file = segments.pop
|
8
|
+
tree = segments.reverse.reduce([file]) {|a,b| [{b => a}] }
|
9
|
+
have_tree(tree)
|
18
10
|
end
|
19
11
|
|
20
|
-
def
|
21
|
-
|
22
|
-
directory_exists? && matches_tree?(@tree)
|
12
|
+
def have_tree(tree)
|
13
|
+
Matcher.new(tree)
|
23
14
|
end
|
24
15
|
|
25
|
-
|
16
|
+
class Matcher < Matchers::Base
|
17
|
+
def initialize(tree)
|
18
|
+
@tree = tree
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
def perform_match!
|
24
|
+
directory_exists? && matches_tree?(@tree)
|
25
|
+
end
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
def matches_tree?(tree, directory='')
|
28
|
+
tree.all? do |entry|
|
29
|
+
if entry.is_a? String
|
30
|
+
Dir[File.join(@subject, directory, entry)].any?
|
31
|
+
elsif entry.is_a? Hash
|
32
|
+
entry.to_a.all?{|dir,subtree| matches_tree?(subtree, File.join(directory, dir))}
|
33
|
+
end
|
33
34
|
end
|
34
35
|
end
|
35
|
-
end
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
def directory_exists?
|
38
|
+
Dir.exists?(@subject)
|
39
|
+
end
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
def expectation
|
42
|
+
"#{@subject} to contain:\n#{print_tree}\n"
|
43
|
+
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
45
|
+
def flatten_tree(structure, directory='')
|
46
|
+
structure.map do |entry|
|
47
|
+
case entry
|
48
|
+
when Hash
|
49
|
+
entry.map{|dir,entries| flatten_tree(entries, "#{directory}#{dir}/")}
|
50
|
+
when String
|
51
|
+
"#{directory}#{entry}"
|
52
|
+
end
|
53
|
+
end.flatten
|
54
|
+
end
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
else
|
64
|
-
missing_files = flatten_tree(@tree).reject do |path|
|
65
|
-
Dir["#{@subject}/#{path}"].any?
|
66
|
-
end
|
67
|
-
if missing_files.any?
|
68
|
-
missing_files.map{|f| "#{f} was not found"}.join("\n")
|
56
|
+
def problems_for_should
|
57
|
+
unless directory_exists?
|
58
|
+
if File.exists? @subject
|
59
|
+
"#{@subject} is not a directory."
|
60
|
+
else
|
61
|
+
"#{@subject} does not exist."
|
62
|
+
end
|
69
63
|
else
|
70
|
-
|
64
|
+
missing_files = flatten_tree(@tree).reject do |path|
|
65
|
+
Dir["#{@subject}/#{path}"].any?
|
66
|
+
end
|
67
|
+
if missing_files.any?
|
68
|
+
missing_files.map{|f| "#{f} was not found"}.join("\n")
|
69
|
+
else
|
70
|
+
"Unknown Problem"
|
71
|
+
end
|
71
72
|
end
|
72
73
|
end
|
73
|
-
end
|
74
74
|
|
75
|
-
|
76
|
-
|
77
|
-
tree.map do |entry|
|
78
|
-
case entry
|
79
|
-
when String then
|
80
|
-
print_file(entry, depth)
|
81
|
-
when Hash
|
82
|
-
entry.map do |k,v|
|
83
|
-
print_directory(k, depth) + "\n" +
|
84
|
-
print_tree(v, depth + 1)
|
85
|
-
end.join("\n")
|
86
|
-
end
|
87
|
-
end.join("\n")
|
88
|
-
end
|
75
|
+
def problems_for_should_not
|
76
|
+
end
|
89
77
|
|
90
|
-
|
91
|
-
|
92
|
-
|
78
|
+
def print_tree(tree=nil, depth=1)
|
79
|
+
tree ||= @tree
|
80
|
+
tree.map do |entry|
|
81
|
+
case entry
|
82
|
+
when String then
|
83
|
+
print_file(entry, depth)
|
84
|
+
when Hash
|
85
|
+
entry.map do |k,v|
|
86
|
+
print_directory(k, depth) + "\n" +
|
87
|
+
print_tree(v, depth + 1)
|
88
|
+
end.join("\n")
|
89
|
+
end
|
90
|
+
end.join("\n")
|
91
|
+
end
|
93
92
|
|
94
|
-
|
95
|
-
|
93
|
+
def print_file(file, depth)
|
94
|
+
"#{" " * depth}#{file}"
|
95
|
+
end
|
96
|
+
|
97
|
+
def print_directory(directory, depth)
|
98
|
+
print_file(directory + '/', depth)
|
99
|
+
end
|
96
100
|
end
|
97
101
|
end
|
98
102
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module AktionTest
|
2
|
+
module Matchers
|
3
|
+
module FileSystem
|
4
|
+
module DirectoryExistance
|
5
|
+
def be_a_directory
|
6
|
+
Matcher.new
|
7
|
+
end
|
8
|
+
|
9
|
+
class Matcher < Matchers::Base
|
10
|
+
def initialize
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
def perform_match!
|
17
|
+
directory_exists?
|
18
|
+
end
|
19
|
+
|
20
|
+
def expectation
|
21
|
+
"#{@subject} to be a directory."
|
22
|
+
end
|
23
|
+
|
24
|
+
def problems_for_should
|
25
|
+
if File.exists? @subject
|
26
|
+
unless File.directory? @subject
|
27
|
+
"#{@subject} is not a directory."
|
28
|
+
else
|
29
|
+
"Unknown"
|
30
|
+
end
|
31
|
+
else
|
32
|
+
"#{@subject} does not exist."
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def problems_for_should_not
|
37
|
+
end
|
38
|
+
|
39
|
+
def directory_exists?
|
40
|
+
Dir.exists? @subject
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -1,108 +1,109 @@
|
|
1
1
|
module AktionTest
|
2
2
|
module Matchers
|
3
3
|
module FileSystem
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
class FileContentMatcher < Matchers::Base
|
9
|
-
def initialize(lines, options={})
|
10
|
-
@original_lines = lines
|
11
|
-
@lines, @options = init_lines(lines), options
|
12
|
-
@options[:match_method] = :all
|
13
|
-
allow_any if @options.delete(:allow_any)
|
14
|
-
sequentially if @options.delete(:sequentially)
|
15
|
-
@options[:after] = regexp(@options[:after]) unless @options[:after].nil?
|
16
|
-
@options[:before] = regexp(@options[:before]) unless @options[:before].nil?
|
4
|
+
module FileContains
|
5
|
+
def match_lines(lines, options={})
|
6
|
+
Matcher.new(lines, options)
|
17
7
|
end
|
18
8
|
|
19
|
-
|
20
|
-
lines
|
21
|
-
|
9
|
+
class Matcher < Matchers::Base
|
10
|
+
def initialize(lines, options={})
|
11
|
+
@original_lines = lines
|
12
|
+
@lines, @options = init_lines(lines), options
|
13
|
+
@options[:match_method] = :all
|
14
|
+
allow_any if @options.delete(:allow_any)
|
15
|
+
sequentially if @options.delete(:sequentially)
|
16
|
+
@options[:after] = regexp(@options[:after]) unless @options[:after].nil?
|
17
|
+
@options[:before] = regexp(@options[:before]) unless @options[:before].nil?
|
18
|
+
end
|
22
19
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
def allow_any
|
29
|
-
@options[:match_method] = :any
|
30
|
-
self
|
31
|
-
end
|
20
|
+
def init_lines(lines)
|
21
|
+
lines.map { |line| regexp(line) }.flatten
|
22
|
+
end
|
32
23
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
24
|
+
def allow_any
|
25
|
+
@options[:match_method] = :any
|
26
|
+
self
|
27
|
+
end
|
37
28
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
29
|
+
def after(match_after)
|
30
|
+
@options[:after] = regexp(match_after)
|
31
|
+
self
|
32
|
+
end
|
42
33
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
34
|
+
def before(match_before)
|
35
|
+
@options[:before] = regexp(match_before)
|
36
|
+
self
|
37
|
+
end
|
47
38
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
end
|
39
|
+
def sequentially
|
40
|
+
@options[:match_method] = :sequence
|
41
|
+
self
|
42
|
+
end
|
53
43
|
|
54
|
-
|
55
|
-
|
56
|
-
|
44
|
+
protected
|
45
|
+
|
46
|
+
def expectation
|
47
|
+
"#{@subject} to have contents:\n---\n#{print_lines}\n---"
|
48
|
+
end
|
49
|
+
|
50
|
+
def perform_match!
|
51
|
+
file_exists? && file_has_contents?
|
52
|
+
end
|
53
|
+
|
54
|
+
def print_lines
|
55
|
+
@original_lines.join("\n")
|
56
|
+
end
|
57
57
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
58
|
+
def problems_for_should
|
59
|
+
if File.exists?(@subject)
|
60
|
+
if File.directory?(@subject)
|
61
|
+
"#{@subject} is a directory."
|
62
|
+
else
|
63
|
+
"Unknown Problem"
|
64
|
+
end
|
62
65
|
else
|
63
|
-
"
|
66
|
+
"#{@subject} does not exist."
|
64
67
|
end
|
65
|
-
else
|
66
|
-
"#{@file} does not exist."
|
67
68
|
end
|
68
|
-
end
|
69
69
|
|
70
|
-
|
71
|
-
|
72
|
-
|
70
|
+
def file_exists?
|
71
|
+
File.exists?(@subject) && !File.directory?(@subject)
|
72
|
+
end
|
73
73
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
74
|
+
def file_has_contents?
|
75
|
+
find = -> lines, match { lines.find_index{|line| line =~ match} }
|
76
|
+
scope = -> lines, scope, default { find[lines, @options[scope]] || default }
|
77
|
+
lines = -> lines { lines.take(scope[lines, :before, lines.count]).drop(scope[lines, :after, -1] + 1) }
|
78
78
|
|
79
79
|
|
80
|
-
|
81
|
-
|
80
|
+
match_method[@lines.map{|line| find[lines[open(@subject).readlines], line]}]
|
81
|
+
end
|
82
82
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
83
|
+
def match_method
|
84
|
+
case @options[:match_method]
|
85
|
+
when :sequence
|
86
|
+
-> result { !result.first.nil? && (result == ((result.first)..(result.first + @lines.count - 1)).to_a) }
|
87
|
+
when :any
|
88
|
+
-> result { !result.all?(&:nil?) }
|
89
|
+
when :all
|
90
|
+
-> result { result.none?(&:nil?) }
|
91
|
+
end
|
91
92
|
end
|
92
|
-
end
|
93
93
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
94
|
+
def regexp(object)
|
95
|
+
case object
|
96
|
+
when Regexp then object
|
97
|
+
when Array then object.map {|item| regexp(item)}
|
98
|
+
when String
|
99
|
+
if object.include? "\n"
|
100
|
+
object.split("\n").map{|item| %r(^#{item}$)}
|
101
|
+
else
|
102
|
+
%r(^#{object}$)
|
103
|
+
end
|
101
104
|
else
|
102
|
-
%r(^#{object}$)
|
105
|
+
%r(^#{object.to_s}$)
|
103
106
|
end
|
104
|
-
else
|
105
|
-
%r(^#{object.to_s}$)
|
106
107
|
end
|
107
108
|
end
|
108
109
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module AktionTest
|
2
|
+
module Matchers
|
3
|
+
module FileSystem
|
4
|
+
module FileExistance
|
5
|
+
def be_a_file
|
6
|
+
Matcher.new
|
7
|
+
end
|
8
|
+
|
9
|
+
class Matcher < Matchers::Base
|
10
|
+
def initialize
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
def perform_match!
|
17
|
+
file_exists? and file_is_not_a_directory?
|
18
|
+
end
|
19
|
+
|
20
|
+
def expectation
|
21
|
+
"#{@subject} to be a file."
|
22
|
+
end
|
23
|
+
|
24
|
+
def problems_for_should
|
25
|
+
if File.exists?(@subject)
|
26
|
+
if File.directory?(@subject)
|
27
|
+
"#{@subject} is a directory."
|
28
|
+
else
|
29
|
+
"Unknown"
|
30
|
+
end
|
31
|
+
else
|
32
|
+
"#{@subject} does not exist."
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def problems_for_should_not
|
37
|
+
end
|
38
|
+
|
39
|
+
def file_exists?
|
40
|
+
File.exists? @subject
|
41
|
+
end
|
42
|
+
|
43
|
+
def file_is_not_a_directory?
|
44
|
+
!File.directory? @subject
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module AktionTest
|
2
|
+
module Module
|
3
|
+
module AktionTest
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do |spec_helper|
|
7
|
+
require 'aktion_test/matchers/base'
|
8
|
+
|
9
|
+
::RSpec.configure do |config|
|
10
|
+
config.include Support::ClassBuilder
|
11
|
+
config.include Matchers::FileSystem::DirectoryExistance
|
12
|
+
config.include Matchers::FileSystem::FileExistance
|
13
|
+
config.include Matchers::FileSystem::DirectoryContains
|
14
|
+
config.include Matchers::FileSystem::FileContains
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module AktionTest
|
2
|
+
module Module
|
3
|
+
module RSpec
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do |spec_helper|
|
7
|
+
::RSpec.configure do |config|
|
8
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
9
|
+
config.run_all_when_everything_filtered = true
|
10
|
+
config.order = 'random'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module AktionTest
|
4
|
+
class SpecHelper
|
5
|
+
include Singleton
|
6
|
+
|
7
|
+
attr_accessor :modules
|
8
|
+
|
9
|
+
class << self
|
10
|
+
include ActiveSupport::Callbacks
|
11
|
+
define_callbacks :load
|
12
|
+
|
13
|
+
def load(*modules)
|
14
|
+
load_constants(modules)
|
15
|
+
|
16
|
+
instance.modules.each do |mod|
|
17
|
+
include mod
|
18
|
+
end
|
19
|
+
|
20
|
+
puts "Loaded #{modules.map(&:to_s).join(', ')}"
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def load_constants(modules)
|
26
|
+
modules.each do |mod|
|
27
|
+
module_name = "AktionTest::Module::#{mod}"
|
28
|
+
begin
|
29
|
+
module_const = module_name.constantize
|
30
|
+
instance.modules << module_const
|
31
|
+
rescue NameError
|
32
|
+
puts "Unknown module #{mod}."
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def initialize
|
39
|
+
@modules = []
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module AktionTest
|
2
|
+
module Support
|
3
|
+
module ClassBuilder
|
4
|
+
def self.included(example_group)
|
5
|
+
example_group.class_eval do
|
6
|
+
after do
|
7
|
+
teardown_defined_constants
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def define_class(class_name, base = Object, &block)
|
13
|
+
class_name = class_name.to_s.camelize
|
14
|
+
|
15
|
+
Class.new(base).tap do |constant_class|
|
16
|
+
Object.const_set(class_name, constant_class)
|
17
|
+
constant_class.unloadable
|
18
|
+
constant_class.class_eval(&block) if block_given?
|
19
|
+
constant_class.reset_column_information if constant_class.respond_to? :reset_column_information
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def teardown_defined_constants
|
24
|
+
ActiveSupport::Dependencies.clear
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
data/lib/aktion_test/version.rb
CHANGED
data/lib/aktion_test.rb
CHANGED
@@ -1,7 +1,34 @@
|
|
1
|
+
require "aktion_test/version"
|
1
2
|
require 'active_support/dependencies'
|
3
|
+
require 'active_support/core_ext'
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
5
|
+
module AktionTest
|
6
|
+
extend ActiveSupport::Autoload
|
7
|
+
|
8
|
+
autoload :SpecHelper
|
9
|
+
|
10
|
+
module Module
|
11
|
+
extend ActiveSupport::Autoload
|
12
|
+
|
13
|
+
autoload :AktionTest
|
14
|
+
autoload :RSpec, 'aktion_test/module/rspec'
|
15
|
+
autoload :Simplecov
|
16
|
+
end
|
17
|
+
|
18
|
+
module Matchers
|
19
|
+
module FileSystem
|
20
|
+
extend ActiveSupport::Autoload
|
21
|
+
|
22
|
+
autoload :DirectoryContains
|
23
|
+
autoload :DirectoryExistance
|
24
|
+
autoload :FileContains
|
25
|
+
autoload :FileExistance
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
module Support
|
30
|
+
extend ActiveSupport::Autoload
|
7
31
|
|
32
|
+
autoload :ClassBuilder
|
33
|
+
end
|
34
|
+
end
|
data/spec/matchers/base_spec.rb
CHANGED
@@ -1,51 +1,59 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe AktionTest::Matchers::Base do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
before :each do
|
5
|
+
matcher_class = define_class('Matcher', described_class) do
|
6
|
+
def expectation; "an expectation"; end
|
7
|
+
def problems_for_should; "\na problem\nanother problem"; end
|
8
|
+
def problems_for_should_not; "\na problem\nanother problem"; end
|
9
|
+
end
|
10
|
+
|
11
|
+
@matcher = matcher_class.new
|
8
12
|
end
|
13
|
+
|
14
|
+
describe '#failure_message' do
|
15
|
+
it "outputs an expectation with associated problems when the matcher is unsuccessful" do
|
16
|
+
@matcher.stub(:perform_match! => false)
|
17
|
+
@matcher.matches?(nil)
|
18
|
+
@matcher.failure_message.should == <<-MSG.strip_heredoc
|
19
|
+
Expected an expectation
|
20
|
+
|
21
|
+
a problem
|
22
|
+
another problem
|
23
|
+
MSG
|
24
|
+
end
|
9
25
|
|
10
|
-
|
11
|
-
|
12
|
-
protected
|
13
|
-
def expectation
|
14
|
-
''
|
15
|
-
end
|
26
|
+
it "raises an error if called before running the matcher" do
|
27
|
+
expect { @matcher.failure_message }.to raise_error(RuntimeError, /failure message before/)
|
16
28
|
end
|
17
29
|
|
18
|
-
|
30
|
+
it "raises an error if called when the matcher was successful" do
|
31
|
+
@matcher.stub(:perform_match! => true)
|
32
|
+
@matcher.matches? nil
|
33
|
+
expect { @matcher.failure_message }.to raise_error(RuntimeError, /failure message while/)
|
34
|
+
end
|
19
35
|
end
|
20
36
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
37
|
+
describe '#negative_failure_message' do
|
38
|
+
before { @matcher.stub(:perform_match! => true) }
|
39
|
+
it 'outputs a negative expectation with associated problems when the matcher is successful' do
|
40
|
+
@matcher.matches?(nil)
|
41
|
+
@matcher.negative_failure_message.should == <<-MSG.strip_heredoc
|
42
|
+
Did not expect an expectation
|
27
43
|
|
28
|
-
|
29
|
-
|
30
|
-
|
44
|
+
a problem
|
45
|
+
another problem
|
46
|
+
MSG
|
31
47
|
end
|
32
48
|
|
33
|
-
matcher
|
34
|
-
|
35
|
-
A Problem
|
36
|
-
MSG
|
37
|
-
end
|
38
|
-
|
39
|
-
it "provides a negative failure message based on #expectation" do
|
40
|
-
matcher = define_class('Matcher', described_class) do
|
41
|
-
protected
|
42
|
-
def expectation
|
43
|
-
'an expectation'
|
44
|
-
end
|
49
|
+
it "raises an error if called before running the matcher" do
|
50
|
+
expect { @matcher.negative_failure_message }.to raise_error(RuntimeError, /negative failure message before/)
|
45
51
|
end
|
46
52
|
|
47
|
-
matcher
|
48
|
-
|
49
|
-
|
53
|
+
it "raises an error if called when the matcher was unsuccessful" do
|
54
|
+
@matcher.stub(:perform_match! => false)
|
55
|
+
@matcher.matches? nil
|
56
|
+
expect { @matcher.negative_failure_message }.to raise_error(RuntimeError, /negative failure message while/)
|
57
|
+
end
|
50
58
|
end
|
51
59
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'active_support/core_ext/string'
|
3
3
|
|
4
|
-
describe AktionTest::Matchers::FileSystem::
|
4
|
+
describe AktionTest::Matchers::FileSystem::DirectoryContains::Matcher do
|
5
5
|
let(:test_root) { File.expand_path(File.join(__FILE__, '..', '..', 'tmp')) }
|
6
6
|
|
7
7
|
before(:each) do
|
@@ -33,18 +33,8 @@ describe AktionTest::Matchers::FileSystem::DirectoryContentMatcher do
|
|
33
33
|
matcher.negative_failure_message.should == <<-MSG.strip_heredoc
|
34
34
|
Did not expect #{test_root} to contain:
|
35
35
|
test_file
|
36
|
-
MSG
|
37
|
-
end
|
38
36
|
|
39
|
-
it "provides a failure message with an unknown problem" do
|
40
|
-
build(['test_file'])
|
41
|
-
matcher = described_class.new(['test_file'])
|
42
|
-
matcher.matches?(test_root)
|
43
|
-
matcher.failure_message.should == <<-MSG.strip_heredoc.strip
|
44
|
-
Expected #{test_root} to contain:
|
45
|
-
test_file
|
46
37
|
|
47
|
-
Unknown Problem
|
48
38
|
MSG
|
49
39
|
end
|
50
40
|
end
|
@@ -201,7 +191,7 @@ describe AktionTest::Matchers::FileSystem::DirectoryContentMatcher do
|
|
201
191
|
#build([{'a' => ['test_file_a', {'b' => [{'c' => ['test_file_b', 'test_file_c']}]}]}])
|
202
192
|
build([{'a' => ['test_file_a']}])
|
203
193
|
matcher(['test_file', {'a' => ['test_file_a', {'b' => [{'c' => ['test_file_b', 'test_file_c']}]}]}]).matches?(test_root)
|
204
|
-
matcher.failure_message.should == <<-FAIL.strip_heredoc
|
194
|
+
matcher.failure_message.should == <<-FAIL.strip_heredoc
|
205
195
|
Expected #{test_root} to contain:
|
206
196
|
test_file
|
207
197
|
a/
|
@@ -227,7 +217,7 @@ describe AktionTest::Matchers::FileSystem::DirectoryContentMatcher do
|
|
227
217
|
|
228
218
|
it "specifies the problem as the subject not existing" do
|
229
219
|
matcher(['some_file']).matches?(nx_root)
|
230
|
-
matcher.failure_message.should == <<-FAIL.strip_heredoc
|
220
|
+
matcher.failure_message.should == <<-FAIL.strip_heredoc
|
231
221
|
Expected #{nx_root} to contain:
|
232
222
|
some_file
|
233
223
|
|
@@ -246,7 +236,7 @@ describe AktionTest::Matchers::FileSystem::DirectoryContentMatcher do
|
|
246
236
|
it "specifies the problem as the subject not being a directory" do
|
247
237
|
bad_root = File.join(test_root, 'test_file')
|
248
238
|
matcher(['some_file']).matches?(bad_root)
|
249
|
-
matcher.failure_message.should == <<-FAIL.strip_heredoc
|
239
|
+
matcher.failure_message.should == <<-FAIL.strip_heredoc
|
250
240
|
Expected #{bad_root} to contain:
|
251
241
|
some_file
|
252
242
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe AktionTest::Matchers::FileSystem::
|
3
|
+
describe AktionTest::Matchers::FileSystem::DirectoryExistance::Matcher do
|
4
4
|
context "an existing directory" do
|
5
5
|
let(:dir) { File.expand_path(File.join(__FILE__, '..')) }
|
6
6
|
|
@@ -11,17 +11,9 @@ describe AktionTest::Matchers::FileSystem::DirectoryExistanceMatcher do
|
|
11
11
|
it "provides a negative failure message" do
|
12
12
|
matcher = described_class.new
|
13
13
|
matcher.matches?(dir)
|
14
|
-
matcher.negative_failure_message.should == <<-MSG.strip_heredoc
|
14
|
+
matcher.negative_failure_message.should == <<-MSG.strip_heredoc
|
15
15
|
Did not expect #{dir} to be a directory.
|
16
|
-
MSG
|
17
|
-
end
|
18
16
|
|
19
|
-
it "provides a failure message with an unknown problem" do
|
20
|
-
matcher = described_class.new
|
21
|
-
matcher.matches?(dir)
|
22
|
-
matcher.failure_message.should == <<-MSG.strip_heredoc.strip
|
23
|
-
Expected #{dir} to be a directory.
|
24
|
-
Unknown
|
25
17
|
MSG
|
26
18
|
end
|
27
19
|
end
|
@@ -36,7 +28,7 @@ describe AktionTest::Matchers::FileSystem::DirectoryExistanceMatcher do
|
|
36
28
|
it "explains that the subject does not exist" do
|
37
29
|
matcher = described_class.new
|
38
30
|
matcher.matches?(dir)
|
39
|
-
matcher.failure_message.should == <<-MSG.strip_heredoc
|
31
|
+
matcher.failure_message.should == <<-MSG.strip_heredoc
|
40
32
|
Expected #{dir} to be a directory.
|
41
33
|
#{dir} does not exist.
|
42
34
|
MSG
|
@@ -53,7 +45,7 @@ describe AktionTest::Matchers::FileSystem::DirectoryExistanceMatcher do
|
|
53
45
|
it "explains that the subject is a file" do
|
54
46
|
matcher = described_class.new
|
55
47
|
matcher.matches?(dir)
|
56
|
-
matcher.failure_message.should == <<-MSG.strip_heredoc
|
48
|
+
matcher.failure_message.should == <<-MSG.strip_heredoc
|
57
49
|
Expected #{dir} to be a directory.
|
58
50
|
#{dir} is not a directory.
|
59
51
|
MSG
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe AktionTest::Matchers::FileSystem::
|
3
|
+
describe AktionTest::Matchers::FileSystem::FileContains::Matcher do
|
4
4
|
def create_file(file='tmp/test_file', &block)
|
5
5
|
FileUtils.mkdir('tmp') unless Dir.exists? 'tmp'
|
6
6
|
File.open(file, 'w') {|f| f << yield }
|
@@ -18,7 +18,7 @@ describe AktionTest::Matchers::FileSystem::FileContentMatcher do
|
|
18
18
|
it 'explains that the file was not found' do
|
19
19
|
matcher = described_class.new(['anything'])
|
20
20
|
matcher.matches?('tmp/test_file')
|
21
|
-
matcher.failure_message.should == <<-MSG.strip_heredoc
|
21
|
+
matcher.failure_message.should == <<-MSG.strip_heredoc
|
22
22
|
Expected tmp/test_file to have contents:
|
23
23
|
---
|
24
24
|
anything
|
@@ -36,7 +36,7 @@ describe AktionTest::Matchers::FileSystem::FileContentMatcher do
|
|
36
36
|
it 'explains that the file is a directory' do
|
37
37
|
matcher = described_class.new(['anything'])
|
38
38
|
matcher.matches?(File.dirname(__FILE__))
|
39
|
-
matcher.failure_message.should == <<-MSG.strip_heredoc
|
39
|
+
matcher.failure_message.should == <<-MSG.strip_heredoc
|
40
40
|
Expected #{File.dirname(__FILE__)} to have contents:
|
41
41
|
---
|
42
42
|
anything
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe AktionTest::Matchers::FileSystem::
|
3
|
+
describe AktionTest::Matchers::FileSystem::FileExistance::Matcher do
|
4
4
|
context "an existing file" do
|
5
5
|
let(:file) { __FILE__ }
|
6
6
|
|
@@ -11,17 +11,9 @@ describe AktionTest::Matchers::FileSystem::FileExistanceMatcher do
|
|
11
11
|
it "provides a negative failure message" do
|
12
12
|
matcher = described_class.new
|
13
13
|
matcher.matches?(file)
|
14
|
-
matcher.negative_failure_message.should == <<-MSG.strip_heredoc
|
14
|
+
matcher.negative_failure_message.should == <<-MSG.strip_heredoc
|
15
15
|
Did not expect #{file} to be a file.
|
16
|
-
MSG
|
17
|
-
end
|
18
16
|
|
19
|
-
it "provides a failure message with an unknown problem" do
|
20
|
-
matcher = described_class.new
|
21
|
-
matcher.matches?(file)
|
22
|
-
matcher.failure_message.should == <<-MSG.strip_heredoc.strip
|
23
|
-
Expected #{file} to be a file.
|
24
|
-
Unknown
|
25
17
|
MSG
|
26
18
|
end
|
27
19
|
end
|
@@ -36,7 +28,7 @@ describe AktionTest::Matchers::FileSystem::FileExistanceMatcher do
|
|
36
28
|
it "explains that the subject does not exist" do
|
37
29
|
matcher = described_class.new
|
38
30
|
matcher.matches?(file)
|
39
|
-
matcher.failure_message.should == <<-MSG.strip_heredoc
|
31
|
+
matcher.failure_message.should == <<-MSG.strip_heredoc
|
40
32
|
Expected #{file} to be a file.
|
41
33
|
#{file} does not exist.
|
42
34
|
MSG
|
@@ -53,7 +45,7 @@ describe AktionTest::Matchers::FileSystem::FileExistanceMatcher do
|
|
53
45
|
it "explains that the subject is a directory" do
|
54
46
|
matcher = described_class.new
|
55
47
|
matcher.matches?(file)
|
56
|
-
matcher.failure_message.should == <<-MSG.strip_heredoc
|
48
|
+
matcher.failure_message.should == <<-MSG.strip_heredoc
|
57
49
|
Expected #{file} to be a file.
|
58
50
|
#{file} is a directory.
|
59
51
|
MSG
|
data/spec/spec_helper.rb
CHANGED
@@ -1,16 +1,3 @@
|
|
1
|
-
require 'simplecov'
|
2
|
-
|
3
|
-
SimpleCov.start do
|
4
|
-
add_filter '/spec/'
|
5
|
-
refuse_coverage_drop
|
6
|
-
minimum_coverage 95
|
7
|
-
end
|
8
|
-
|
9
|
-
require 'active_support/core_ext/string'
|
10
1
|
require 'aktion_test'
|
11
2
|
|
12
|
-
|
13
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
14
|
-
config.run_all_when_everything_filtered = true
|
15
|
-
config.order = 'random'
|
16
|
-
end
|
3
|
+
AktionTest::SpecHelper.load :Simplecov, :RSpec, :AktionTest
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aktion_test
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -110,20 +110,23 @@ files:
|
|
110
110
|
- Rakefile
|
111
111
|
- aktion_test.gemspec
|
112
112
|
- lib/aktion_test.rb
|
113
|
-
- lib/aktion_test/class_builder.rb
|
114
113
|
- lib/aktion_test/matchers/base.rb
|
115
|
-
- lib/aktion_test/matchers/file_system/be_a_directory.rb
|
116
|
-
- lib/aktion_test/matchers/file_system/be_a_file.rb
|
117
114
|
- lib/aktion_test/matchers/file_system/directory_contains.rb
|
115
|
+
- lib/aktion_test/matchers/file_system/directory_existance.rb
|
118
116
|
- lib/aktion_test/matchers/file_system/file_contains.rb
|
119
|
-
- lib/aktion_test/matchers/
|
117
|
+
- lib/aktion_test/matchers/file_system/file_existance.rb
|
118
|
+
- lib/aktion_test/module/aktion_test.rb
|
119
|
+
- lib/aktion_test/module/rspec.rb
|
120
|
+
- lib/aktion_test/module/simplecov.rb
|
121
|
+
- lib/aktion_test/spec_helper.rb
|
122
|
+
- lib/aktion_test/support/class_builder.rb
|
120
123
|
- lib/aktion_test/version.rb
|
121
124
|
- spec/aktion_test/class_builder_spec.rb
|
122
125
|
- spec/matchers/base_spec.rb
|
123
|
-
- spec/matchers/be_a_directory_spec.rb
|
124
|
-
- spec/matchers/be_a_file_spec.rb
|
125
126
|
- spec/matchers/directory_contains_spec.rb
|
127
|
+
- spec/matchers/directory_existance_spec.rb
|
126
128
|
- spec/matchers/file_contains_spec.rb
|
129
|
+
- spec/matchers/file_existance_spec.rb
|
127
130
|
- spec/spec_helper.rb
|
128
131
|
homepage: http://aktionlab.com
|
129
132
|
licenses:
|
@@ -144,6 +147,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
147
|
- - ! '>='
|
145
148
|
- !ruby/object:Gem::Version
|
146
149
|
version: '0'
|
150
|
+
segments:
|
151
|
+
- 0
|
152
|
+
hash: -214091085
|
147
153
|
requirements: []
|
148
154
|
rubyforge_project:
|
149
155
|
rubygems_version: 1.8.24
|
@@ -153,8 +159,8 @@ summary: Gems, libs, helpers for test suites.
|
|
153
159
|
test_files:
|
154
160
|
- spec/aktion_test/class_builder_spec.rb
|
155
161
|
- spec/matchers/base_spec.rb
|
156
|
-
- spec/matchers/be_a_directory_spec.rb
|
157
|
-
- spec/matchers/be_a_file_spec.rb
|
158
162
|
- spec/matchers/directory_contains_spec.rb
|
163
|
+
- spec/matchers/directory_existance_spec.rb
|
159
164
|
- spec/matchers/file_contains_spec.rb
|
165
|
+
- spec/matchers/file_existance_spec.rb
|
160
166
|
- spec/spec_helper.rb
|
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'active_support/dependencies'
|
2
|
-
|
3
|
-
module AktionTest
|
4
|
-
module ClassBuilder
|
5
|
-
def self.included(example_group)
|
6
|
-
example_group.class_eval do
|
7
|
-
after do
|
8
|
-
teardown_defined_constants
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def define_class(class_name, base = Object, &block)
|
14
|
-
class_name = class_name.to_s.camelize
|
15
|
-
|
16
|
-
Class.new(base).tap do |constant_class|
|
17
|
-
Object.const_set(class_name, constant_class)
|
18
|
-
constant_class.unloadable
|
19
|
-
constant_class.class_eval(&block) if block_given?
|
20
|
-
constant_class.reset_column_information if constant_class.respond_to? :reset_column_information
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def teardown_defined_constants
|
25
|
-
ActiveSupport::Dependencies.clear
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
RSpec.configure {|config| config.include AktionTest::ClassBuilder}
|
31
|
-
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module AktionTest
|
2
|
-
module Matchers
|
3
|
-
module FileSystem
|
4
|
-
def be_a_directory
|
5
|
-
DirectoryExistanceMatcher.new
|
6
|
-
end
|
7
|
-
|
8
|
-
class DirectoryExistanceMatcher < Matchers::Base
|
9
|
-
def initialize
|
10
|
-
end
|
11
|
-
|
12
|
-
def matches?(subject)
|
13
|
-
@subject = subject
|
14
|
-
directory_exists?
|
15
|
-
end
|
16
|
-
|
17
|
-
protected
|
18
|
-
|
19
|
-
def expectation
|
20
|
-
"#{@subject} to be a directory."
|
21
|
-
end
|
22
|
-
|
23
|
-
def problem
|
24
|
-
if File.exists? @subject
|
25
|
-
unless File.directory? @subject
|
26
|
-
"#{@subject} is not a directory."
|
27
|
-
else
|
28
|
-
"Unknown"
|
29
|
-
end
|
30
|
-
else
|
31
|
-
"#{@subject} does not exist."
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def directory_exists?
|
36
|
-
Dir.exists? @subject
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
module AktionTest
|
2
|
-
module Matchers
|
3
|
-
module FileSystem
|
4
|
-
def be_a_file
|
5
|
-
FileExistanceMatcher.new
|
6
|
-
end
|
7
|
-
|
8
|
-
class FileExistanceMatcher < Matchers::Base
|
9
|
-
def initialize
|
10
|
-
end
|
11
|
-
|
12
|
-
def matches?(subject)
|
13
|
-
@subject = subject
|
14
|
-
file_exists? and file_is_not_a_directory?
|
15
|
-
end
|
16
|
-
|
17
|
-
protected
|
18
|
-
|
19
|
-
def expectation
|
20
|
-
"#{@subject} to be a file."
|
21
|
-
end
|
22
|
-
|
23
|
-
def problem
|
24
|
-
if File.exists?(@subject)
|
25
|
-
if File.directory?(@subject)
|
26
|
-
"#{@subject} is a directory."
|
27
|
-
else
|
28
|
-
"Unknown"
|
29
|
-
end
|
30
|
-
else
|
31
|
-
"#{@subject} does not exist."
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def file_exists?
|
36
|
-
File.exists? @subject
|
37
|
-
end
|
38
|
-
|
39
|
-
def file_is_not_a_directory?
|
40
|
-
!File.directory? @subject
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
@@ -1,8 +0,0 @@
|
|
1
|
-
require 'aktion_test/matchers/file_system/be_a_file'
|
2
|
-
require 'aktion_test/matchers/file_system/be_a_directory'
|
3
|
-
require 'aktion_test/matchers/file_system/directory_contains'
|
4
|
-
require 'aktion_test/matchers/file_system/file_contains'
|
5
|
-
|
6
|
-
module RSpec::Matchers
|
7
|
-
include AktionTest::Matchers::FileSystem
|
8
|
-
end
|