gitnesse 0.12.6 → 1.0.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +6 -0
  3. data/Rakefile +6 -11
  4. data/bin/.keep +0 -0
  5. data/bin/gitnesse +2 -32
  6. data/config/gitnesse.rb.example +2 -4
  7. data/gitnesse.gemspec +22 -21
  8. data/lib/gitnesse/cli/helpers/config_helpers.rb +13 -0
  9. data/lib/gitnesse/cli/helpers/feature_helpers.rb +26 -0
  10. data/lib/gitnesse/cli/helpers/wiki_helpers.rb +53 -0
  11. data/lib/gitnesse/cli/task/help.rb +42 -0
  12. data/lib/gitnesse/cli/task/info.rb +29 -0
  13. data/lib/gitnesse/cli/task/pull.rb +26 -0
  14. data/lib/gitnesse/cli/task/push.rb +101 -0
  15. data/lib/gitnesse/cli/task/run.rb +85 -0
  16. data/lib/gitnesse/cli/task.rb +67 -0
  17. data/lib/gitnesse/cli.rb +55 -0
  18. data/lib/gitnesse/config.rb +68 -0
  19. data/lib/gitnesse/config_loader.rb +36 -0
  20. data/lib/gitnesse/dependency_checker.rb +86 -0
  21. data/lib/gitnesse/dir_manager.rb +37 -0
  22. data/lib/gitnesse/feature.rb +63 -0
  23. data/lib/gitnesse/feature_extractor.rb +29 -0
  24. data/lib/gitnesse/feature_transform.rb +30 -0
  25. data/lib/gitnesse/hooks/gitnesse.rb +5 -0
  26. data/lib/gitnesse/hooks.rb +30 -33
  27. data/lib/gitnesse/railtie.rb +3 -1
  28. data/lib/gitnesse/rake/tasks.rake +11 -0
  29. data/lib/gitnesse/tasks.rb +7 -4
  30. data/lib/gitnesse/version.rb +1 -1
  31. data/lib/gitnesse/wiki/page.rb +103 -0
  32. data/lib/gitnesse/wiki.rb +80 -143
  33. data/lib/gitnesse.rb +10 -102
  34. data/spec/lib/cli/task/help_spec.rb +34 -0
  35. data/spec/lib/cli/task/info_spec.rb +22 -0
  36. data/spec/lib/cli/task/pull_spec.rb +24 -0
  37. data/spec/lib/cli/task/push_spec.rb +24 -0
  38. data/spec/lib/cli_spec.rb +13 -0
  39. data/spec/lib/config_loader_spec.rb +46 -0
  40. data/spec/lib/config_spec.rb +61 -0
  41. data/spec/lib/dependency_checker_spec.rb +193 -0
  42. data/spec/lib/dir_manager_spec.rb +46 -0
  43. data/spec/lib/feature_extractor_spec.rb +30 -0
  44. data/spec/lib/feature_spec.rb +53 -0
  45. data/spec/lib/feature_transform_spec.rb +25 -0
  46. data/spec/lib/hooks_spec.rb +40 -0
  47. data/spec/lib/version_spec.rb +9 -0
  48. data/spec/lib/wiki/page_spec.rb +68 -0
  49. data/spec/lib/wiki_spec.rb +34 -0
  50. data/spec/spec_helper.rb +4 -0
  51. data/spec/support/cli.rb +20 -0
  52. data/spec/support/example_config/gitnesse.rb +4 -0
  53. data/{test/test_helper.rb → spec/support/example_features/addition.feature} +0 -16
  54. data/spec/support/example_features/division.feature +10 -0
  55. data/spec/support/example_wiki_pages/developer_can_sync_features_to_code.md +29 -0
  56. data/spec/support_helper.rb +79 -0
  57. metadata +103 -109
  58. data/README.md +0 -85
  59. data/features/step_definitions/gitnesse_steps.rb +0 -54
  60. data/features/support/env.rb +0 -65
  61. data/features/sync_wiki_features_to_code.feature +0 -29
  62. data/lib/gitnesse/configuration.rb +0 -54
  63. data/lib/gitnesse/dependencies.rb +0 -39
  64. data/lib/gitnesse/features.rb +0 -38
  65. data/lib/gitnesse/git_config.rb +0 -39
  66. data/lib/gitnesse/support/hook.rb +0 -11
  67. data/lib/gitnesse/tasks.rake +0 -34
  68. data/test/lib/gitnesse/build_page_content_test.rb +0 -89
  69. data/test/lib/gitnesse/commit_info_test.rb +0 -16
  70. data/test/lib/gitnesse/configuration_defaults_test.rb +0 -11
  71. data/test/lib/gitnesse/configuration_to_hash_test.rb +0 -25
  72. data/test/lib/gitnesse/custom_branch_test.rb +0 -24
  73. data/test/lib/gitnesse/dependencies_check_test.rb +0 -73
  74. data/test/lib/gitnesse/extract_features_test.rb +0 -44
  75. data/test/lib/gitnesse/gather_test.rb +0 -30
  76. data/test/lib/gitnesse/load_feature_files_into_wiki_test.rb +0 -34
  77. data/test/lib/gitnesse/read_git_config_test.rb +0 -33
  78. data/test/lib/gitnesse/strip_results_test.rb +0 -52
  79. data/test/lib/gitnesse/version_test.rb +0 -7
  80. data/test/lib/gitnesse/wiki_append_results_test.rb +0 -50
  81. data/test/lib/gitnesse/write_file_test.rb +0 -18
  82. data/test/wiki_test_helper.rb +0 -11
data/lib/gitnesse/wiki.rb CHANGED
@@ -1,182 +1,119 @@
1
+ Dir[File.dirname(__FILE__) + "/wiki/*.rb"].each { |f| require(f) }
2
+
3
+ require 'git'
4
+
1
5
  module Gitnesse
2
6
  class Wiki
3
- attr_accessor :wiki
4
-
5
- def initialize(dir = Dir.mktmpdir)
6
- @wiki = Gollum::Wiki.new(dir)
7
- @commit_info = Gitnesse.generate_commit_info
8
- end
7
+ attr_reader :repo, :pages, :dir
9
8
 
10
- # Public: Loads the provided feature files into the wiki
9
+ # Public: Clones/updates a wiki in the provided dir
11
10
  #
12
- # feature_files - a collection of files to search for features
13
- # e.g. Dir.glob("./features/**/*.feature")
11
+ # url - cloneable URL for wiki repository
12
+ # dir - directory to clone git wiki into
13
+ # opts - hash of options:
14
+ # clone - whether or not to clone/update local copy of remote wiki
14
15
  #
15
- def load_feature_files(feature_files)
16
- return if feature_files.nil?
16
+ # Returns a Gitnesse::Wiki object
17
+ def initialize(url, dir, opts={clone: true})
18
+ @url = url
19
+ @dir = dir
20
+ @opts = opts
21
+ @config = Gitnesse::Config.instance
22
+
23
+ clone_or_update_repo unless !opts[:clone]
17
24
 
18
- feature_files.each do |feature_file|
19
- feature_name = File.basename(feature_file, ".feature")
20
- feature_content = File.read(feature_file)
21
- wiki_page = @wiki.page(feature_name)
22
- wiki_page ||= @wiki.page("#{feature_name}.feature")
25
+ @repo ||= Git.init(dir)
23
26
 
24
- if wiki_page
25
- update_wiki_page(wiki_page, feature_name, feature_content)
26
- else
27
- create_wiki_page(feature_name, feature_content)
27
+ @pages = @repo.status.each_with_object([]) do |s, a|
28
+ if s.path =~ /\.feature\.md$/
29
+ a << Gitnesse::Wiki::Page.new("#{dir}/#{s.path}")
28
30
  end
29
31
  end
30
- end
31
32
 
32
- # Public: Returns the Wiki's pages
33
- #
34
- # Returns an array of Wiki pages
35
- def pages
36
- @wiki.pages
33
+ @pages
37
34
  end
38
35
 
39
- # Public: Extracts gherkins from wiki page
40
- #
41
- # page - Wiki page to get features from
42
- #
43
- # Returns a hash of Cucumber features
44
- def self.extract_features(page)
45
- data = page.respond_to?(:raw_data) ? page.raw_data : page
46
- features = {}
47
-
48
- if match_result = data.match(/\u0060{3}gherkin(.+)\u0060{3}/m)
49
- captures = match_result.captures
50
-
51
- # create hash with feature name as key and feature text as value
52
- captures.each do |capture|
53
- feature_definition_at = capture.index('Feature:')
54
- feature_text = capture[feature_definition_at,capture.size-1]
55
- feature_lines = feature_text.split("\n")
56
- feature_definition = feature_lines.grep(/^Feature:/).first
57
-
58
- if feature_definition
59
- feature_name = feature_definition.split(":").last.strip.gsub(" ","-").downcase
60
- features[feature_name] = feature_text
36
+ # Public: Removes pages previously placed by Gitnesse. This includes the
37
+ # feature listing pages.
38
+ #
39
+ # Returns nothing.
40
+ def remove_features
41
+ @repo.status.each do |file|
42
+ if file.path =~ /^features(\.md|\ >)/
43
+ begin
44
+ @repo.remove(file.path)
45
+ rescue Git::GitExecuteError => e
46
+ # Git spat something on git rm [file]. Likely the file doesn't
47
+ # exist, or was previously removed and hasn't been committed yet.
48
+ # It's likely fine. If not, we'll abort and show the end user the
49
+ # error Git sent to us.
50
+ unless e.message =~ /did not match any files/
51
+ puts " A Git error occured. The message it passed to us was:"
52
+ abort e.message
53
+ end
61
54
  end
62
55
  end
63
56
  end
64
-
65
- features
66
- end
67
-
68
- # Public: Builds wiki page content
69
- #
70
- # feature_content - Content to generate the page content from
71
- # old_page_content - old page content to replace with new page content
72
- #
73
- # Returns a string containing the generated page content
74
- def build_page_content(feature_content, old_page_content = nil)
75
- content = "```gherkin\n#{feature_content}\n```"
76
- return content if old_page_content.nil? || old_page_content.empty?
77
-
78
- features = Wiki.extract_features(old_page_content)
79
-
80
- _, old_feature_content = features.shift
81
- old_page_content.sub(old_feature_content, feature_content)
82
57
  end
83
58
 
84
- # Public: Removes past Cucumber results from feature files
59
+ # Public: Commits staged wiki changes
85
60
  #
86
61
  # Returns nothing
87
- def remove_past_results
88
- @commit_info[:message] = Gitnesse.configuration.info
89
- features = Dir.glob("#{Gitnesse.configuration.target_directory}/*.feature")
90
-
91
- features.each do |feature|
92
- feature_name = File.basename(feature, ".feature")
93
- page = @wiki.page(feature_name) || @wiki.page("#{feature_name}.feature")
94
-
95
- if page
96
- content = page.raw_data
97
- content = strip_results(content)
98
- @wiki.update_page(page, page.name, :markdown, content, @commit_info)
62
+ def commit
63
+ begin
64
+ @repo.commit("Update features with Gitnesse")
65
+ rescue Git::GitExecuteError => e
66
+ unless e.message =~ /nothing to commit/
67
+ puts " A Git error occured. The message it passed to us was:"
68
+ abort e.message
99
69
  end
100
70
  end
101
71
  end
102
72
 
103
- # Public: Strips old cucumber results
104
- #
105
- # content - the string to remote old results from
73
+ # Public: Pushes new commits to remote wiki
106
74
  #
107
- # Returns a string
108
- def strip_results(content)
109
- if content.match(/\u0060{3}gherkin.*\u0060{3}(.*)/m)[1]
110
- [ "FAILED", "PASSED", "PENDING", "UNDEFINED" ].each do |type|
111
- content.gsub!(/\n*\!\[\]\(.*\) \`Last result was #{type}: .*\n*/, '')
112
- end
113
- end
114
- content
75
+ # Returns nothing
76
+ def push
77
+ @repo.push
115
78
  end
116
79
 
117
- # Public: Appends results of cucumber scenario to wiki
80
+ # Public: Adds or updates wiki page
118
81
  #
119
- # scenario - Cucumber scenario from After hook
82
+ # filename - filename for wiki page
83
+ # content - content for page
120
84
  #
121
- # Returns a string containing the scenario result
122
- def append_results(scenario)
123
- filename = File.basename(scenario.feature.file, ".feature")
124
- @commit_info[:message] = Gitnesse.configuration.info
125
-
126
- self.pages.each do |page|
127
- if page.name == filename || page.name == "#{filename}.feature"
128
- if page.text_data.include? scenario.name
129
- content = page.raw_data
85
+ # Returns a Wiki::Page
86
+ def add_page(filename, content)
87
+ full_filename = "#{@dir}/#{filename}"
130
88
 
131
- case scenario.status
132
- when :undefined then image = "![](https://s3.amazonaws.com/gitnesse/github/undefined.png)"
133
- when :passed then image = "![](https://s3.amazonaws.com/gitnesse/github/passing.png)"
134
- when :failed then image = "![](https://s3.amazonaws.com/gitnesse/github/failing.png)"
135
- when :pending then image = "![](https://s3.amazonaws.com/gitnesse/github/pending.png)"
136
- else image = "![](https://s3.amazonaws.com/gitnesse/github/undefined.png)"
137
- end
138
-
139
- string = "\n#{image} \`Last result was #{scenario.status.to_s.upcase}: #{scenario.name} (#{Time.now.to_s} - #{Gitnesse.configuration.info})\`\n"
140
- content.gsub(string, '')
141
- content << string
142
- @wiki.update_page(page, page.name, :markdown, content, @commit_info)
143
- return string
144
- end
145
- end
89
+ if @pages.detect { |f| f.wiki_path == full_filename }
90
+ page = @pages.find { |f| f.wiki_path == full_filename }
91
+ else
92
+ page = Gitnesse::Wiki::Page.new(full_filename)
93
+ @pages << page
146
94
  end
147
- end
148
-
149
- private
150
95
 
151
- # Private: Creates a new wiki page for the provided name and content
152
- #
153
- # name - the name of the page to create
154
- # content - the content the page should have
155
- #
156
- # Returns the newly created wiki page
157
- def create_wiki_page(name, content)
158
- new_page_content = build_page_content(content)
159
- @wiki.write_page(name, :markdown, new_page_content, @commit_info)
160
- puts " \e[32mCreated page \e[0m#{name}."
96
+ page.write(content)
97
+ @repo.add(filename)
98
+ page
161
99
  end
162
100
 
163
- # Private: Updates a wiki page with the provided name and content
164
- #
165
- # wiki_page - the page to update
166
- # page_name - the name of the page
167
- # feature_content - the feature content to compare/update
101
+ private
102
+ # Private: Clones or Updates the local copy of the remote wiki
168
103
  #
169
- # Returns the page
170
- def update_wiki_page(wiki_page, page_name, feature_content)
171
- wiki_page_content = wiki_page.raw_data
172
- new_page_content = build_page_content(feature_content, wiki_page_content)
173
-
174
- if new_page_content == wiki_page_content
175
- puts " \e[32mPage \e[0m#{page_name} \e[32mdidn't change\e[0m."
104
+ # Returns nothing
105
+ def clone_or_update_repo
106
+ if File.directory?(@dir + "/.git")
107
+ puts " Updating local copy of remote wiki."
108
+ @repo = Git.open(@dir)
109
+ @repo.pull('origin', @config.branch)
176
110
  else
177
- @wiki.update_page(wiki_page, page_name, :markdown, new_page_content, @commit_info)
178
- puts " \e[33mUpdated page \e[0m#{page_name}."
111
+ puts " Creating local copy of remote wiki."
112
+ Dir.mkdir @dir unless File.directory?(@dir)
113
+ @repo = Git.clone @url, @dir
179
114
  end
115
+
116
+ @repo.checkout(@config.branch)
180
117
  end
181
118
  end
182
119
  end
data/lib/gitnesse.rb CHANGED
@@ -1,107 +1,15 @@
1
- require 'bundler/setup'
2
- require 'gollum'
3
- require 'fileutils'
4
- require 'pathname'
5
- require 'tmpdir'
6
- require 'gitnesse/configuration'
7
- require 'gitnesse/git_config'
8
- require 'gitnesse/dependencies'
9
- require 'gitnesse/features'
10
- require 'gitnesse/hooks'
1
+ require 'gitnesse/version'
2
+ require 'gitnesse/config'
3
+ require 'gitnesse/config_loader'
4
+ require 'gitnesse/dependency_checker'
5
+ require 'gitnesse/feature'
6
+ require 'gitnesse/feature_extractor'
7
+ require 'gitnesse/feature_transform'
8
+ require 'gitnesse/dir_manager'
11
9
  require 'gitnesse/wiki'
10
+ require 'gitnesse/hooks'
11
+
12
12
  require 'gitnesse/railtie' if defined?(Rails)
13
13
 
14
- # core module
15
14
  module Gitnesse
16
- class << self
17
- attr_accessor :configuration
18
- attr_accessor :commit_info
19
- end
20
-
21
- self.configuration ||= Configuration.new
22
-
23
- extend self
24
-
25
- def self.configure
26
- yield(configuration)
27
- end
28
-
29
- # -- all methods after this are module functions --
30
- module_function
31
-
32
- def run
33
- if pull
34
- Hooks.create
35
- puts "\n Now going to run Cucumber."
36
- exec("cucumber #{Gitnesse.configuration.target_directory}/*.feature")
37
- end
38
- end
39
-
40
- def push_results
41
- if push
42
- Hooks.create
43
- puts "\n Now going to run Cucumber."
44
- exec("cucumber #{Gitnesse.configuration.target_directory}/*.feature")
45
- end
46
- end
47
-
48
- # pull features from git wiki, and sync up with features dir
49
- def pull
50
- Dependencies.check
51
-
52
- relative_path = Pathname.new(Gitnesse.configuration.target_directory).relative_path_from(Pathname.new(Dir.pwd))
53
-
54
- puts " Pulling features into ./#{relative_path} from #{Gitnesse.configuration.repository_url}."
55
- Dir.mktmpdir do |tmp_dir|
56
- if clone_feature_repo(tmp_dir)
57
- FileUtils.mkdir(Gitnesse.configuration.target_directory) unless File.exists?(Gitnesse.configuration.target_directory)
58
-
59
- wiki_pages = Wiki.new(tmp_dir).pages
60
- wiki_pages.each do |page|
61
- name = page.name.gsub('.feature', '')
62
- filename = "#{Gitnesse.configuration.target_directory}/#{name}.feature"
63
- features = Wiki.extract_features(page)
64
- Features.write_file(filename, features) unless features.empty?
65
- end
66
- end
67
- end
68
- puts " \e[32mDone pulling features.\e[0m"
69
- true
70
- end
71
-
72
- # push features back up to git wiki from features directory
73
- def push
74
- Dependencies.check
75
- generate_commit_info
76
-
77
- relative_path = Pathname.new(Gitnesse.configuration.target_directory).relative_path_from(Pathname.new(Dir.pwd))
78
-
79
- puts " Pushing features from ./#{relative_path} to #{Gitnesse.configuration.repository_url}."
80
- Dir.mktmpdir do |tmp_dir|
81
- if clone_feature_repo(tmp_dir)
82
- feature_files = Dir.glob("#{Gitnesse.configuration.target_directory}/*.feature")
83
- Wiki.new(tmp_dir).load_feature_files(feature_files)
84
-
85
- # push the changes to the remote git
86
- Dir.chdir(tmp_dir) do
87
- `git push origin master &> /dev/null`
88
- end
89
- end
90
- end
91
- puts " \e[32mDone pushing features.\e[0m"
92
- true
93
- end
94
-
95
- def clone_feature_repo(dir)
96
- output = `git clone #{Gitnesse.configuration.repository_url} #{dir} &> /dev/null`
97
- $?.success?
98
- end
99
-
100
- def generate_commit_info
101
- self.commit_info ||= begin
102
- user_name = GitConfig.read("user.name")
103
- email = GitConfig.read("user.email")
104
- { :name => user_name, :email => email, :message => "Update features with Gitnesse" }
105
- end
106
- end
107
15
  end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+ require 'gitnesse/cli'
3
+
4
+ module Gitnesse
5
+ describe Cli, type: :cli do
6
+ let(:overview) do
7
+ <<-EOS
8
+ USAGE: gitnesse <task> [<args>]
9
+
10
+ The gitnesse tasks are:
11
+ info Prints current Gitnesse configuration
12
+ pull Pulls features from remote git-based wiki
13
+ push Pushes local features to remote git-based wiki
14
+ run Pulls changes from remote git-based wiki, and runs Cucumber.
15
+
16
+ See 'gitnesse help <task>' for more information on a specific task.
17
+ EOS
18
+ end
19
+
20
+ it 'displays help overview when called with no args' do
21
+ expect(gitnesse("")).to eq overview
22
+ end
23
+
24
+ it 'displays help overview when help task is called with no arguments' do
25
+ expect(gitnesse("help")).to eq overview
26
+ end
27
+
28
+ context "when no help text for a given topic is available" do
29
+ it "prints out a message" do
30
+ expect(gitnesse("help missing")).to eq "No help for task 'missing'\n"
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ require 'gitnesse/cli'
3
+
4
+ module Gitnesse
5
+ describe Cli, type: :cli do
6
+ let(:result) do
7
+ <<-EOS
8
+ Current Gitnesse Configuration:
9
+ repository_url - [not set]
10
+ features_dir - features
11
+ branch - master
12
+ annotate_results - [not set]
13
+ identifier - [not set]
14
+ EOS
15
+ end
16
+
17
+ it "prints the current configuration" do
18
+ expect(Gitnesse::ConfigLoader).to receive(:find_and_load)
19
+ expect(gitnesse("info")).to eq result
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'gitnesse/cli'
3
+
4
+ module Gitnesse
5
+ describe Cli, type: :cli do
6
+ let(:help) do
7
+ <<-EOS
8
+ USAGE: gitnesse pull
9
+
10
+ Pulls features from remote git-based wiki
11
+
12
+ Pulls the remote wiki, finds the feature files it contains, and updates the
13
+ relevant local features, creating new ones if necessary.
14
+
15
+ Examples:
16
+ gitnesse pull # will pull features from remote wiki
17
+ EOS
18
+ end
19
+
20
+ it "has help info" do
21
+ expect(gitnesse("help pull")).to eq help
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'gitnesse/cli'
3
+
4
+ module Gitnesse
5
+ describe Cli, type: :cli do
6
+ let(:help) do
7
+ <<-EOS
8
+ USAGE: gitnesse push
9
+
10
+ Pushes local features to remote git-based wiki
11
+
12
+ Pushes the local features files to the remote git-based wiki, creating/updating
13
+ wiki pages as necessary.
14
+
15
+ Examples:
16
+ gitnesse push # will push local features to remote wiki
17
+ EOS
18
+ end
19
+
20
+ it "has help info" do
21
+ expect(gitnesse("help push")).to eq help
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+ require 'gitnesse/cli'
3
+
4
+ module Gitnesse
5
+ describe Cli, type: :cli do
6
+ describe "-v, --version" do
7
+ it "outputs the gem name and version" do
8
+ expect(gitnesse("--version")).to eq "gitnesse #{Gitnesse::VERSION}\n"
9
+ expect(gitnesse("-v")).to eq "gitnesse #{Gitnesse::VERSION}\n"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ module Gitnesse
4
+ describe ConfigLoader do
5
+ let(:config) { Config.instance }
6
+
7
+ describe "#find_and_load" do
8
+ context "when no config file exists" do
9
+ before do
10
+ Dir.should_receive(:glob).and_return([])
11
+ ConfigLoader.should_receive(:raise_error).with("Can't find a gitnesse.rb file with Gitnesse configuration.")
12
+ end
13
+
14
+ it "raises an error" do
15
+ ConfigLoader.find_and_load
16
+ end
17
+ end
18
+
19
+ context "when one config file exists" do
20
+ before do
21
+ files = [Support.example_config_file_path]
22
+ Dir.should_receive(:glob).and_return(files)
23
+ ConfigLoader.should_receive(:load).and_return(true)
24
+ ConfigLoader.should_receive(:reject_irrelevant_files).and_return(files)
25
+ end
26
+
27
+ it "loads the config file" do
28
+ ConfigLoader.find_and_load
29
+ end
30
+ end
31
+
32
+ context "when multiple config files exist" do
33
+ before do
34
+ files = [Support.example_config_file_path, Support.example_config_file_path]
35
+ Dir.should_receive(:glob).and_return(files)
36
+ ConfigLoader.should_receive(:reject_irrelevant_files).and_return(files)
37
+ ConfigLoader.should_receive(:raise_error).with("Multiple configuration files found:", files)
38
+ end
39
+
40
+ it "raises an error" do
41
+ ConfigLoader.find_and_load
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ module Gitnesse
4
+ describe Config do
5
+ let(:config) { Config.instance }
6
+ let(:default_config_hash) do
7
+ {
8
+ annotate_results: false,
9
+ branch: 'master',
10
+ identifier: nil,
11
+ features_dir: 'features',
12
+ repository_url: nil
13
+ }
14
+ end
15
+
16
+ it "is a singleton" do
17
+ expect(Config.instance).to eq config
18
+ expect{Config.new}.to raise_error NoMethodError
19
+ end
20
+
21
+ it "has default settings" do
22
+ expect(config.branch).to eq 'master'
23
+ expect(config.annotate_results).to be_false
24
+ expect(config.features_dir).to eq 'features'
25
+ end
26
+
27
+ describe ".to_h" do
28
+ it "returns a hash of config data" do
29
+ expect(config.to_h).to eq default_config_hash
30
+ end
31
+ end
32
+
33
+ describe ".setup" do
34
+ context "when a block is not passed" do
35
+ it "returns the configuration hash" do
36
+ expect(Config.config).to eq default_config_hash
37
+ end
38
+ end
39
+
40
+ context "when a block is passed" do
41
+ before do
42
+ Config.config do |config|
43
+ config.annotate_results = true
44
+ end
45
+ end
46
+
47
+ let(:expected_results) do
48
+ default_config_hash.tap { |h| h[:annotate_results] = true }
49
+ end
50
+
51
+ it "allows for config values to be set" do
52
+ expect(config.annotate_results).to be_true
53
+ end
54
+
55
+ it "returns the configuration hash" do
56
+ expect(Config.config).to eq expected_results
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end