rspec-terraspace 0.0.0 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +20 -0
- data/Gemfile +4 -0
- data/lib/rspec/terraspace.rb +6 -1
- data/lib/rspec/terraspace/helpers.rb +7 -0
- data/lib/rspec/terraspace/project.rb +80 -12
- data/lib/rspec/terraspace/ts.rb +17 -11
- data/lib/rspec/terraspace/version.rb +1 -1
- data/lib/templates/bootstrap/.rspec +3 -0
- data/lib/templates/bootstrap/spec/spec_helper.rb +13 -0
- data/lib/templates/module/test/.rspec +3 -0
- data/lib/templates/module/test/Gemfile.tt +9 -0
- data/lib/templates/module/test/spec/main_spec.rb.tt +25 -0
- data/lib/templates/module/test/spec/spec_helper.rb +18 -0
- data/lib/templates/project/spec/%test_name%_spec.rb.tt +5 -0
- data/lib/templates/stack/test/.rspec +3 -0
- data/lib/templates/stack/test/Gemfile.tt +9 -0
- data/lib/templates/stack/test/spec/fixtures/config/app.rb +4 -0
- data/lib/templates/stack/test/spec/fixtures/config/terraform/provider.tf.tt +5 -0
- data/lib/templates/stack/test/spec/fixtures/tfvars/%name%.tfvars +1 -0
- data/lib/templates/stack/test/spec/main_spec.rb.tt +30 -0
- data/lib/templates/stack/test/spec/spec_helper.rb +18 -0
- metadata +18 -4
- data/Gemfile.lock +0 -54
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 42c4017e3ddd5cd3cfd9cdf4d6e59582ecaadbe6f1cf34df7d2c56c8180a9e8f
|
4
|
+
data.tar.gz: f9fba8a8ffa4d70071a04f487fadf519d174dff1665572d6dbf86652048d7eca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8296689a8b23250cd37e2e9823b761a3529063adddffc45d7a76f685769702eafbb4d38d6df1911565c2c6a4a457b297bc8417d1de273afa67382a321df6c7d
|
7
|
+
data.tar.gz: 1e835b72584ba6a459555645b5791f8f3f63782c48d01639caf3487c31129da149463ae69f3c3f352bafe27f054c0c5e2795126390e5bbd3dc92f05ee9c89da7
|
data/.gitignore
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
This project *tries* to adhere to [Semantic Versioning](http://semver.org/).
|
5
|
+
|
6
|
+
## [0.2.3] - 2021-05-31
|
7
|
+
- [#4](https://github.com/boltops-tools/rspec-terraspace/pull/4) fix module test generator
|
8
|
+
|
9
|
+
## [0.2.2] - 2020-11-17
|
10
|
+
- fix outputs helper and templates
|
11
|
+
|
12
|
+
## [0.2.1] - 2020-11-16
|
13
|
+
- [#3](https://github.com/boltops-tools/rspec-terraspace/pull/3) add config terraform provider template for azure test
|
14
|
+
|
15
|
+
## [0.2.0] - 2020-11-15
|
16
|
+
- [#2](https://github.com/boltops-tools/rspec-terraspace/pull/2) stack test like module test template, reconfigure logger
|
17
|
+
- stack test like module test template, reconfigure logger
|
18
|
+
|
19
|
+
## [0.1.0]
|
20
|
+
- Initial release
|
data/Gemfile
CHANGED
data/lib/rspec/terraspace.rb
CHANGED
@@ -12,6 +12,11 @@ RSpec::Terraspace::Autoloader.setup
|
|
12
12
|
module Rspec
|
13
13
|
module Terraspace
|
14
14
|
class Error < StandardError; end
|
15
|
-
# Your code goes here...
|
16
15
|
end
|
17
16
|
end
|
17
|
+
|
18
|
+
require "terraspace"
|
19
|
+
|
20
|
+
Terraspace::Tester.register("rspec",
|
21
|
+
root: File.expand_path("../..", __dir__)
|
22
|
+
)
|
@@ -2,6 +2,13 @@ module RSpec::Terraspace
|
|
2
2
|
module Helpers
|
3
3
|
extend Memoist
|
4
4
|
|
5
|
+
def reconfigure_logging(level="info")
|
6
|
+
path = "/tmp/terraspace/log/test.log"
|
7
|
+
FileUtils.mkdir_p(File.dirname(path))
|
8
|
+
Terraspace.logger = Terraspace::Logger.new(path)
|
9
|
+
puts "Terraspace.logger has been reconfigured to #{path}"
|
10
|
+
end
|
11
|
+
|
5
12
|
def ts
|
6
13
|
Ts.new
|
7
14
|
end
|
@@ -5,41 +5,105 @@ module RSpec::Terraspace
|
|
5
5
|
class Project
|
6
6
|
def initialize(options={})
|
7
7
|
@options = options
|
8
|
-
@name = options[:name]
|
8
|
+
@name = options[:name]
|
9
|
+
@config = options[:config]
|
9
10
|
@modules = options[:modules]
|
10
11
|
@stacks = options[:stacks]
|
12
|
+
@tfvars = options[:tfvars]
|
13
|
+
@folders = options[:folders]
|
11
14
|
|
12
15
|
@remove_test_folder = options[:remove_test_folder].nil? ? true : options[:remove_test_folder]
|
13
16
|
end
|
14
17
|
|
15
18
|
def create
|
19
|
+
puts "Building test harness at: #{build_dir}"
|
16
20
|
clean
|
17
21
|
build_project
|
22
|
+
build_config
|
18
23
|
build_modules
|
19
24
|
build_stacks
|
20
|
-
|
25
|
+
build_tfvars
|
26
|
+
build_folders
|
27
|
+
puts "Test harness built."
|
21
28
|
build_dir
|
22
29
|
end
|
23
30
|
|
31
|
+
# folders at any-level, including top-level can be copied with the folders option
|
32
|
+
def build_folders
|
33
|
+
return unless @folders
|
34
|
+
|
35
|
+
@folders.each do |folder|
|
36
|
+
dest = "#{build_dir}/#{folder}"
|
37
|
+
FileUtils.mkdir_p(File.dirname(dest))
|
38
|
+
FileUtils.cp_r(folder, dest)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
24
42
|
def build_project
|
25
43
|
parent_dir = File.dirname(build_dir)
|
26
44
|
FileUtils.mkdir_p(parent_dir)
|
27
45
|
Dir.chdir(parent_dir) do
|
28
46
|
project_name = File.basename(build_dir)
|
29
|
-
::Terraspace::CLI::New::Project.start([project_name])
|
47
|
+
::Terraspace::CLI::New::Project.start([project_name, "--no-config", "--quiet"])
|
30
48
|
end
|
49
|
+
end
|
31
50
|
|
32
|
-
|
33
|
-
|
34
|
-
|
51
|
+
def build_config
|
52
|
+
return unless @config
|
53
|
+
|
54
|
+
config_folder = "#{build_dir}/config"
|
55
|
+
FileUtils.rm_rf(config_folder) # wipe current config folder
|
56
|
+
FileUtils.mkdir_p(File.dirname(config_folder))
|
57
|
+
src = @config
|
58
|
+
FileUtils.cp_r(src, config_folder)
|
35
59
|
end
|
36
60
|
|
37
61
|
def build_modules
|
38
|
-
|
62
|
+
return unless @modules
|
63
|
+
build_type_folder("modules", @modules)
|
39
64
|
end
|
40
65
|
|
41
66
|
def build_stacks
|
42
|
-
|
67
|
+
return unless @stacks
|
68
|
+
build_type_folder("stacks", @stacks)
|
69
|
+
end
|
70
|
+
|
71
|
+
# If a file has been supplied, then it gets copied over.
|
72
|
+
#
|
73
|
+
# # File
|
74
|
+
# terraspace.build_test_harness(
|
75
|
+
# tfvars: {demo: "spec/fixtures/tfvars/demo.tfvars"},
|
76
|
+
# end
|
77
|
+
#
|
78
|
+
# # Results in:
|
79
|
+
# app/stacks/#{stack}/tfvars/test.tfvars
|
80
|
+
#
|
81
|
+
# If a directory has been supplied, then the folder fully gets copied over.
|
82
|
+
#
|
83
|
+
# # Directory
|
84
|
+
# terraspace.build_test_harness(
|
85
|
+
# tfvars: {demo: "spec/fixtures/tfvars/demo"},
|
86
|
+
# end
|
87
|
+
#
|
88
|
+
# # Results in (whatever is in the folder):
|
89
|
+
# app/stacks/#{stack}/tfvars/base.tfvars
|
90
|
+
# app/stacks/#{stack}/tfvars/test.tfvars
|
91
|
+
#
|
92
|
+
def build_tfvars
|
93
|
+
return unless @tfvars
|
94
|
+
@tfvars.each do |stack, src|
|
95
|
+
tfvars_folder = "#{build_dir}/app/stacks/#{stack}/tfvars"
|
96
|
+
FileUtils.rm_rf(tfvars_folder) # wipe current tfvars folder. dont use any of the live values
|
97
|
+
|
98
|
+
if File.directory?(src)
|
99
|
+
FileUtils.mkdir_p(File.dirname(tfvars_folder))
|
100
|
+
FileUtils.cp_r(src, tfvars_folder)
|
101
|
+
else # if only a single file, then generate a test.tfvars since this runs under TS_ENV=test
|
102
|
+
dest = "#{tfvars_folder}/test.tfvars"
|
103
|
+
FileUtils.mkdir_p(File.dirname(dest))
|
104
|
+
FileUtils.cp(src, dest)
|
105
|
+
end
|
106
|
+
end
|
43
107
|
end
|
44
108
|
|
45
109
|
# Inputs:
|
@@ -58,7 +122,7 @@ module RSpec::Terraspace
|
|
58
122
|
# If provide a String, it should be a path to folder containing all modules or stacks.
|
59
123
|
# This provides less fine-grain control but is easier to use and shorter.
|
60
124
|
#
|
61
|
-
def
|
125
|
+
def build_type_folder(type_dir, list)
|
62
126
|
case list
|
63
127
|
when Hash
|
64
128
|
list.each do |name, src|
|
@@ -89,11 +153,15 @@ module RSpec::Terraspace
|
|
89
153
|
end
|
90
154
|
|
91
155
|
def build_dir
|
92
|
-
"#{
|
156
|
+
"#{tmp_root}/#{@name}"
|
157
|
+
end
|
158
|
+
|
159
|
+
def tmp_root
|
160
|
+
self.class.tmp_root
|
93
161
|
end
|
94
162
|
|
95
|
-
def
|
96
|
-
|
163
|
+
def self.tmp_root
|
164
|
+
"#{Terraspace.tmp_root}/test-harnesses"
|
97
165
|
end
|
98
166
|
end
|
99
167
|
end
|
data/lib/rspec/terraspace/ts.rb
CHANGED
@@ -7,14 +7,16 @@ module RSpec::Terraspace
|
|
7
7
|
CLI = ::Terraspace::CLI
|
8
8
|
|
9
9
|
def build_test_harness(options={})
|
10
|
-
puts "Building test harness..."
|
11
10
|
project = Project.new(options)
|
12
|
-
|
13
|
-
|
11
|
+
root = project.create
|
12
|
+
Terraspace.root = root # switch root to the generated test harness
|
14
13
|
end
|
15
14
|
|
16
15
|
def up(args)
|
17
16
|
run("up #{args} -y")
|
17
|
+
mod = args.split(' ').first
|
18
|
+
@mod = ::Terraspace::Mod.new(mod)
|
19
|
+
save_output
|
18
20
|
end
|
19
21
|
|
20
22
|
def down(args)
|
@@ -22,23 +24,27 @@ module RSpec::Terraspace
|
|
22
24
|
end
|
23
25
|
|
24
26
|
def run(command)
|
27
|
+
puts "=> terraspace #{command}".color(:green)
|
25
28
|
args = command.split(' ')
|
26
29
|
CLI.start(args)
|
27
30
|
end
|
28
31
|
|
29
|
-
|
30
|
-
|
32
|
+
# Note: a terraspace.down will remove the output.json since it does a clean
|
33
|
+
def save_output
|
34
|
+
FileUtils.mkdir_p(File.dirname(out_path))
|
35
|
+
run("output #{@mod.name} --format json --out #{out_path}")
|
31
36
|
end
|
32
|
-
memoize :save_output
|
33
37
|
|
34
38
|
def output(mod, name)
|
35
|
-
|
36
|
-
data = JSON.load(IO.read(saved_output_path))
|
37
|
-
data.dig(name, "value")
|
39
|
+
outputs.dig(name, "value")
|
38
40
|
end
|
39
41
|
|
40
|
-
def
|
41
|
-
|
42
|
+
def outputs
|
43
|
+
JSON.load(IO.read(out_path))
|
44
|
+
end
|
45
|
+
|
46
|
+
def out_path
|
47
|
+
"#{Terraspace.tmp_root}/rspec/output.json"
|
42
48
|
end
|
43
49
|
end
|
44
50
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
describe "main" do
|
2
|
+
before(:all) do
|
3
|
+
reconfigure_logging # reconfigure Terraspace.logger to a file
|
4
|
+
mod_path = File.expand_path("../..", __dir__) # the source of the module to test is 2 levels up
|
5
|
+
# Build terraspace project to use as a test harness
|
6
|
+
# Will be located at: /tmp/terraspace/test-harnesses/<%= name %>-harness
|
7
|
+
terraspace.build_test_harness(
|
8
|
+
name: "<%= name %>-harness",
|
9
|
+
modules: {<%= name %>: mod_path},
|
10
|
+
)
|
11
|
+
terraspace.up("<%= name %>")
|
12
|
+
end
|
13
|
+
after(:all) do
|
14
|
+
terraspace.down("<%= name %>")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "successful deploy" do
|
18
|
+
# Replace with your own test
|
19
|
+
expect(true).to be true
|
20
|
+
# Example
|
21
|
+
# pp terraspace.outputs
|
22
|
+
# output_value = terraspace.output("<%= name %>", "some-output")
|
23
|
+
# expect(output_value).to include("some-value")
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
ENV["TS_ENV"] = "test"
|
2
|
+
|
3
|
+
require "terraspace"
|
4
|
+
require "rspec/terraspace"
|
5
|
+
|
6
|
+
module Helper
|
7
|
+
def execute(cmd)
|
8
|
+
puts "Running: #{cmd}" if ENV['SHOW_COMMAND']
|
9
|
+
out = `#{cmd}`
|
10
|
+
puts out if ENV['SHOW_COMMAND']
|
11
|
+
out
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
RSpec.configure do |c|
|
16
|
+
c.include Helper
|
17
|
+
c.include RSpec::Terraspace::Helpers
|
18
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# This is where you put your tfvars
|
@@ -0,0 +1,30 @@
|
|
1
|
+
describe "main" do
|
2
|
+
before(:all) do
|
3
|
+
reconfigure_logging # reconfigure Terraspace.logger to a file
|
4
|
+
stack_path = File.expand_path("../..", __dir__) # the source of the stack to test is 2 levels up
|
5
|
+
ts_root = File.expand_path("../../..", stack_path) # original Terraspace.root
|
6
|
+
# Build terraspace project to use as a test harness
|
7
|
+
# Will be located at: /tmp/terraspace/test-harnesses/<%= name %>-harness
|
8
|
+
terraspace.build_test_harness(
|
9
|
+
name: "<%= name %>-harness",
|
10
|
+
modules: "#{ts_root}/app/modules", # include all modules in folder
|
11
|
+
stacks: {<%= name %>: stack_path},
|
12
|
+
# override demo stack tfvars for testing
|
13
|
+
tfvars: {demo: "#{stack_path}/test/spec/fixtures/tfvars/demo.tfvars"},
|
14
|
+
config: "#{stack_path}/test/spec/fixtures/config",
|
15
|
+
)
|
16
|
+
terraspace.up("<%= name %>")
|
17
|
+
end
|
18
|
+
after(:all) do
|
19
|
+
terraspace.down("<%= name %>")
|
20
|
+
end
|
21
|
+
|
22
|
+
it "successful deploy" do
|
23
|
+
# Replace with your own test
|
24
|
+
expect(true).to be true
|
25
|
+
# Example
|
26
|
+
# pp terraspace.outputs
|
27
|
+
# output_value = terraspace.output("<%= name %>", "some-output")
|
28
|
+
# expect(output_value).to include("some-value")
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
ENV["TS_ENV"] = "test"
|
2
|
+
|
3
|
+
require "terraspace"
|
4
|
+
require "rspec/terraspace"
|
5
|
+
|
6
|
+
module Helper
|
7
|
+
def execute(cmd)
|
8
|
+
puts "Running: #{cmd}" if ENV['SHOW_COMMAND']
|
9
|
+
out = `#{cmd}`
|
10
|
+
puts out if ENV['SHOW_COMMAND']
|
11
|
+
out
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
RSpec.configure do |c|
|
16
|
+
c.include Helper
|
17
|
+
c.include RSpec::Terraspace::Helpers
|
18
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-terraspace
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tung Nguyen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -89,8 +89,8 @@ extra_rdoc_files: []
|
|
89
89
|
files:
|
90
90
|
- ".gitignore"
|
91
91
|
- ".rspec"
|
92
|
+
- CHANGELOG.md
|
92
93
|
- Gemfile
|
93
|
-
- Gemfile.lock
|
94
94
|
- LICENSE.txt
|
95
95
|
- README.md
|
96
96
|
- Rakefile
|
@@ -102,6 +102,20 @@ files:
|
|
102
102
|
- lib/rspec/terraspace/project.rb
|
103
103
|
- lib/rspec/terraspace/ts.rb
|
104
104
|
- lib/rspec/terraspace/version.rb
|
105
|
+
- lib/templates/bootstrap/.rspec
|
106
|
+
- lib/templates/bootstrap/spec/spec_helper.rb
|
107
|
+
- lib/templates/module/test/.rspec
|
108
|
+
- lib/templates/module/test/Gemfile.tt
|
109
|
+
- lib/templates/module/test/spec/main_spec.rb.tt
|
110
|
+
- lib/templates/module/test/spec/spec_helper.rb
|
111
|
+
- lib/templates/project/spec/%test_name%_spec.rb.tt
|
112
|
+
- lib/templates/stack/test/.rspec
|
113
|
+
- lib/templates/stack/test/Gemfile.tt
|
114
|
+
- lib/templates/stack/test/spec/fixtures/config/app.rb
|
115
|
+
- lib/templates/stack/test/spec/fixtures/config/terraform/provider.tf.tt
|
116
|
+
- lib/templates/stack/test/spec/fixtures/tfvars/%name%.tfvars
|
117
|
+
- lib/templates/stack/test/spec/main_spec.rb.tt
|
118
|
+
- lib/templates/stack/test/spec/spec_helper.rb
|
105
119
|
- rspec-terraspace.gemspec
|
106
120
|
homepage: https://github.com/boltops-tools/rspec-terraspace
|
107
121
|
licenses:
|
@@ -122,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
122
136
|
- !ruby/object:Gem::Version
|
123
137
|
version: '0'
|
124
138
|
requirements: []
|
125
|
-
rubygems_version: 3.
|
139
|
+
rubygems_version: 3.2.5
|
126
140
|
signing_key:
|
127
141
|
specification_version: 4
|
128
142
|
summary: Terraspace RSpec support
|
data/Gemfile.lock
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
rspec-terraspace (0.1.0)
|
5
|
-
activesupport
|
6
|
-
memoist
|
7
|
-
rainbow
|
8
|
-
zeitwerk
|
9
|
-
|
10
|
-
GEM
|
11
|
-
remote: https://rubygems.org/
|
12
|
-
specs:
|
13
|
-
activesupport (6.0.3.1)
|
14
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
15
|
-
i18n (>= 0.7, < 2)
|
16
|
-
minitest (~> 5.1)
|
17
|
-
tzinfo (~> 1.1)
|
18
|
-
zeitwerk (~> 2.2, >= 2.2.2)
|
19
|
-
concurrent-ruby (1.1.6)
|
20
|
-
diff-lcs (1.3)
|
21
|
-
i18n (1.8.2)
|
22
|
-
concurrent-ruby (~> 1.0)
|
23
|
-
memoist (0.16.2)
|
24
|
-
minitest (5.14.1)
|
25
|
-
rainbow (3.0.0)
|
26
|
-
rake (12.3.3)
|
27
|
-
rspec (3.9.0)
|
28
|
-
rspec-core (~> 3.9.0)
|
29
|
-
rspec-expectations (~> 3.9.0)
|
30
|
-
rspec-mocks (~> 3.9.0)
|
31
|
-
rspec-core (3.9.2)
|
32
|
-
rspec-support (~> 3.9.3)
|
33
|
-
rspec-expectations (3.9.2)
|
34
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
35
|
-
rspec-support (~> 3.9.0)
|
36
|
-
rspec-mocks (3.9.1)
|
37
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
38
|
-
rspec-support (~> 3.9.0)
|
39
|
-
rspec-support (3.9.3)
|
40
|
-
thread_safe (0.3.6)
|
41
|
-
tzinfo (1.2.7)
|
42
|
-
thread_safe (~> 0.1)
|
43
|
-
zeitwerk (2.3.0)
|
44
|
-
|
45
|
-
PLATFORMS
|
46
|
-
ruby
|
47
|
-
|
48
|
-
DEPENDENCIES
|
49
|
-
rake (~> 12.0)
|
50
|
-
rspec (~> 3.0)
|
51
|
-
rspec-terraspace!
|
52
|
-
|
53
|
-
BUNDLED WITH
|
54
|
-
2.1.4
|