backdrop 0.2.5 → 0.3.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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YjRlOWZhMzkyNWQ1YmYwOTQzYWZiYWE0YzRjY2RjOTRlMTg3YTMwNQ==
4
+ M2MzZjUzNDNkMmVhNGUxMTlhNDAyNzYwOGJlZjVlMzk1N2M5MTQ0NQ==
5
5
  data.tar.gz: !binary |-
6
- YTAzYjQwODdkNjNkMjQ1OTNiMjNmOGE3Y2Y5ZDNjYjAzZmNiM2NlMQ==
6
+ YmViMmI4NTBiZGYxM2U0NGJmMzkwZDBkZmM0NWFkZTgwZTU4MGQxZg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MDhhYWZkY2YxMGMzODNhYmNhY2UyYmI2NzVlNTRmMGE5M2JjZDhlODgzMzli
10
- NDU1ZGJiN2VjN2I2M2JjODgxNjY4YjgwOTMwYzExYmU2NGU2NTRiZDdhMzY2
11
- YWM3OTIxNjQyMjQ2NTY5YzZmNDZmYWRmY2IxMTc4MmE5NmRmYzA=
9
+ OTAxMDAwODMzZDVmNDFjMmVlYmU1ZmEwNThjYjdhM2MwZWNiNWU5MGJkZjk2
10
+ MWE4NGU5YmI1NDE4OWIwMThjZTgxZGI5OWZkZTI1MzM1M2EwNmFkYjNmNWJm
11
+ MzRiMTYzZDhhNDIwZDhhODYwZWJiMDZkOTc4MzIzYWNlNmJlNTU=
12
12
  data.tar.gz: !binary |-
13
- MDY4YjJiYTI5ZTk2OWVjYWNjMWNjMTFkZTcwNzhmZDBjNDdkNGY3NDY3YmYy
14
- Mzc2OWFiMmNiMTBlNTQzYmRiOWE1NjYwMWM4MWQ0NDFmZTAzMTM3YWYzMWU5
15
- NWMyMDE5OTRkNGI0ODg2MzI3NzUzYjAwNjAyOGQwNTQ5YmMyZjY=
13
+ MDAxYmMxM2MzYmYwOTIwNDY3ZWY4NmQ4YWJkZGYwYjk5N2MyYzhhNWVkODUx
14
+ YjJkN2U1MzEzYTMyMzkxYmUwZjQ2YzhjYmYxM2Y5MjU4ZGRlNGQ3OGE0Yjk0
15
+ MTJkYmFjZDNlOWMzYTg4NjVmYWI4M2M1ZDc1MGFhMWUxYjc1ZWE=
data/.gitignore CHANGED
@@ -7,3 +7,4 @@ lib/tasks/fixtures.rake
7
7
  /tmp
8
8
  /log
9
9
  /doc
10
+ *.orig
@@ -0,0 +1 @@
1
+ backdrop
@@ -0,0 +1 @@
1
+ 2.1.4
@@ -7,7 +7,7 @@ env:
7
7
  global:
8
8
  - CODECLIMATE_REPO_TOKEN=a79c2033f8bd8de4442fbffdee847be7f8a505408ef40350ac598264d2fe2ccc
9
9
  rvm:
10
- - 2.1.2
10
+ - 2.1.4
11
11
  - 2.0.0
12
12
  script:
13
13
  - bundle exec rake
data/Gemfile CHANGED
@@ -6,8 +6,9 @@ group :test do
6
6
  gem 'byebug'
7
7
  gem 'codeclimate-test-reporter', require: false
8
8
  gem 'coveralls', require: false
9
+ gem 'factory_girl'
9
10
  gem 'rack-test'
10
- gem 'rake_rack'
11
+ gem 'rake-n-bake'
11
12
  gem 'rspec'
12
13
  gem 'rubocop'
13
14
  gem 'simplecov', require: false
data/README.md CHANGED
@@ -45,6 +45,6 @@ lib/tasks/backdrop.rake
45
45
  Call `rake backdrop` to create all RAD APIs in the specified output directory
46
46
 
47
47
  Dependencies
48
- ============
48
+ ------------
49
49
 
50
50
  * Ruby >= 2.0.0
data/Rakefile CHANGED
@@ -1 +1,2 @@
1
1
  Dir.glob('lib/tasks/*.rake').each { |task| import task }
2
+ require 'rake_n_bake'
@@ -5,14 +5,16 @@ Gem::Specification.new do |s|
5
5
  s.name = 'backdrop'
6
6
  s.version = Backdrop::VERSION
7
7
  s.date = '2014-09-16'
8
- s.summary = 'Fixture generation using RAD'
9
- s.description = 'Fixture generation using RAD'
10
- s.authors = ['Tom Bowden', 'Richard Vickerstaff', 'Adam Whittingham']
8
+ s.summary = 'JSON Fixture generation'
9
+ s.description = 'Create and host fixture generation based on simple ruby
10
+ objects for use in local integration testing against
11
+ multiple remote APIs'
12
+ s.authors = ['Tom Bowden']
11
13
  s.files = `git ls-files`.split($RS)
12
14
  s.email = 'tom.b1992@gmail.com'
13
15
  s.homepage = 'http://github.com/tpbowden/backdrop'
14
16
  s.license = 'MIT'
15
17
  s.required_ruby_version = '>= 2.0.0'
16
- s.add_dependency 'sinatra', '~> 1.4'
17
18
  s.add_dependency 'rake', '~> 10.1'
19
+ s.add_dependency 'sinatra', '~> 1.4'
18
20
  end
@@ -1,11 +1,5 @@
1
- require 'sinatra/base'
2
- require 'backdrop/version'
3
1
  require 'backdrop/configuration'
4
- require 'backdrop/runner'
5
- require 'backdrop/extractor'
6
- require 'backdrop/builders/builder'
7
- require 'backdrop/builders/get'
8
- require 'backdrop/builders/put'
2
+ require 'backdrop/api_builder'
9
3
  require 'backdrop/app'
10
4
 
11
5
  module Backdrop
@@ -20,4 +14,12 @@ module Backdrop
20
14
  def self.configure
21
15
  yield(configuration) if block_given?
22
16
  end
17
+
18
+ def self.load(input)
19
+ APIBuilder.new.build input
20
+ end
21
+
22
+ def self.clear
23
+ Backdrop::App.reset!
24
+ end
23
25
  end
@@ -0,0 +1,29 @@
1
+ require 'backdrop/app'
2
+
3
+ module Backdrop
4
+ class APIBuilder
5
+ def build(input)
6
+ if input.respond_to?(:map)
7
+ build_array(input)
8
+ else
9
+ build_single(input)
10
+ end
11
+ end
12
+
13
+ private
14
+
15
+ def build_array(input)
16
+ url = nil
17
+ formatted_data = input.map do |record|
18
+ url = record.delete_field 'backdrop_url'
19
+ record.to_h
20
+ end
21
+ Backdrop::App.load_api(url, JSON.generate(formatted_data))
22
+ end
23
+
24
+ def build_single(input)
25
+ url = input.delete_field('backdrop_url')
26
+ Backdrop::App.load_api(url, JSON.generate(input.to_h))
27
+ end
28
+ end
29
+ end
@@ -1,27 +1,10 @@
1
+ require 'sinatra'
2
+
1
3
  module Backdrop
2
4
  class App < Sinatra::Base
3
- SUPPORTED_HTTP_METHODS = [:get, :put]
4
-
5
- def initialize(app = nil)
6
- super app
7
- self.class.build_routes
8
- end
9
-
10
- def self.build_routes
11
- SUPPORTED_HTTP_METHODS.each do |method|
12
- files = Dir["#{Backdrop.configuration.output_dir}/**/*.#{method}"]
13
- files.each do |file|
14
- route = file.gsub Backdrop.configuration.output_dir, ''
15
- route = route.gsub ".#{method}", ''
16
- build_route(method, route, file)
17
- end
18
- end
19
- end
20
-
21
- def self.build_route(method, route, file)
22
- send(method, route) do
23
- builder = Backdrop::Builders.const_get(method.to_s.capitalize).new
24
- builder.route(self, file)
5
+ def self.load_api(url, data)
6
+ get url do
7
+ data
25
8
  end
26
9
  end
27
10
  end
@@ -1,32 +1,4 @@
1
1
  module Backdrop
2
2
  class Configuration
3
- attr_accessor :output_dir
4
- attr_accessor :projects
5
- attr_reader :http
6
-
7
- def initialize
8
- @output_dir = './fixtures'
9
- @projects = []
10
- @http = Http.new
11
- end
12
-
13
- class Http
14
- attr_accessor :get
15
- attr_accessor :put
16
- attr_reader :http_methods
17
-
18
- def initialize
19
- @get = Backdrop::Builders::Get
20
- @put = Backdrop::Builders::Put
21
- @http_methods = [:get, :put]
22
- end
23
-
24
- def method_missing(method, arg)
25
- http_method = method.to_s.gsub('=', '')
26
- self.class.__send__(:attr_accessor, http_method)
27
- send(method, arg)
28
- @http_methods << (http_method.to_sym)
29
- end
30
- end
31
3
  end
32
4
  end
@@ -1,3 +1,3 @@
1
1
  module Backdrop
2
- VERSION = '0.2.5'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -1,8 +1,6 @@
1
- require 'rake_rack'
2
-
3
1
  task default: [
4
2
  :rubocop,
5
- :"rake_rack:rspec",
6
- :"rake_rack:coverage:check_specs",
7
- :"rake_rack:ok_rainbow"
3
+ :"bake:rspec",
4
+ :"bake:coverage:check_specs",
5
+ :"bake:ok_rainbow"
8
6
  ]
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ require 'backdrop/api_builder'
3
+
4
+ describe Backdrop::APIBuilder do
5
+ describe '#build' do
6
+ let(:url) { '/some/location' }
7
+
8
+ context 'when the input is a single item' do
9
+ let(:sample_input) { build :example, backdrop_url: url }
10
+ let(:json) { '{"some":"data"}' }
11
+ it 'tells the server to load the API' do
12
+ expect(Backdrop::App).to receive(:load_api).with url, json
13
+ subject.build sample_input
14
+ end
15
+ end
16
+
17
+ context 'when the input is an array of items' do
18
+ let(:sample_input) { build_list :example, 2, backdrop_url: url }
19
+ let(:json) { '[{"some":"data"},{"some":"data"}]' }
20
+ it 'tells the server to load the API array' do
21
+ expect(Backdrop::App).to receive(:load_api).with url, json
22
+ subject.build sample_input
23
+ end
24
+ end
25
+ end
26
+ end
@@ -3,61 +3,4 @@ require 'backdrop'
3
3
 
4
4
  describe Backdrop::Configuration do
5
5
 
6
- describe '#output_dir' do
7
- it 'defaults to ./fixtures' do
8
- expect(subject.output_dir).to eq './fixtures'
9
- end
10
- end
11
-
12
- describe '#output_dir=' do
13
- it 'can be configured' do
14
- subject.output_dir = 'somewhere'
15
- expect(subject.output_dir).to eq 'somewhere'
16
- end
17
- end
18
-
19
- describe '#projects' do
20
- it 'defaults to empty array' do
21
- expect(subject.projects).to eq []
22
- end
23
- it 'can be configured' do
24
- subject.projects = [1, 2]
25
- expect(subject.projects).to eq [1, 2]
26
- end
27
- end
28
-
29
- describe '#http' do
30
- it 'allows the assignment of any method' do
31
- expect(subject.http).to be_a Backdrop::Configuration::Http
32
- end
33
- end
34
-
35
- describe Backdrop::Configuration::Http do
36
- describe '#http_methods' do
37
- it 'defaults the HTTP methods to the ones with defaults' do
38
- expect(subject.http_methods).to eq [:get, :put]
39
- end
40
- end
41
-
42
- describe '#METHOD' do
43
-
44
- it 'allows anything to be set' do
45
- subject.something = 'hello'
46
- expect(subject.something).to eq 'hello'
47
- end
48
-
49
- it 'adds new methods to the http_methods array' do
50
- subject.val = 'something'
51
- expect(subject.http_methods).to include(:val)
52
- end
53
-
54
- it 'sets get to be a GET builder' do
55
- expect(subject.get).to eq Backdrop::Builders::Get
56
- end
57
-
58
- it 'sets put to be the PUT builder' do
59
- expect(subject.put).to eq Backdrop::Builders::Put
60
- end
61
- end
62
- end
63
6
  end
@@ -20,14 +20,26 @@ describe Backdrop do
20
20
  end
21
21
 
22
22
  describe '.reset' do
23
- before do
24
- Backdrop.configure do |config|
25
- config.output_dir = 'somewhere'
26
- end
27
- end
23
+ let!(:subject) { Backdrop.configuration }
28
24
  it 'resets all configuration' do
29
25
  Backdrop.reset
30
- expect(Backdrop.configuration.output_dir).to eq './fixtures'
26
+ expect(Backdrop.configuration).to_not eq subject
27
+ end
28
+ end
29
+
30
+ describe '.load' do
31
+ let(:input) { %w('some', 'data') }
32
+ it 'delegates to the Backdrop API Builder' do
33
+ expect(Backdrop::APIBuilder)
34
+ .to receive_message_chain('new.build').with input
35
+ described_class.load input
36
+ end
37
+ end
38
+
39
+ describe '.clear' do
40
+ it 'clears all routes from the web server' do
41
+ expect(Backdrop::App).to receive(:reset!)
42
+ Backdrop.clear
31
43
  end
32
44
  end
33
45
  end
@@ -0,0 +1,8 @@
1
+ require 'ostruct'
2
+
3
+ FactoryGirl.define do
4
+ factory :example, class: OpenStruct do
5
+ backdrop_url '/example/data'
6
+ some 'data'
7
+ end
8
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+ require 'rack/test'
3
+ require 'backdrop'
4
+
5
+ describe Backdrop do
6
+ include Rack::Test::Methods
7
+
8
+ def app
9
+ Backdrop::App
10
+ end
11
+
12
+ before do
13
+ Backdrop.clear
14
+ Backdrop.load sample_factory_data
15
+ end
16
+
17
+ context 'when it is a single object' do
18
+ let(:sample_factory_data) { build :example }
19
+
20
+ it 'builds an API based on factory girl data' do
21
+ get '/example/data'
22
+ expect(last_response.body).to eq '{"some":"data"}'
23
+ end
24
+ end
25
+
26
+ context 'when it is an array of objects' do
27
+ let(:sample_factory_data) { build_list :example, 2 }
28
+
29
+ it 'builds an API based on the array of factory girl data' do
30
+ get '/example/data'
31
+ expect(last_response.body).to eq '[{"some":"data"},{"some":"data"}]'
32
+ end
33
+ end
34
+ end
@@ -22,9 +22,13 @@ SimpleCov.start do
22
22
  add_filter 'spec'
23
23
  end
24
24
 
25
+ require 'factory_girl'
26
+ FactoryGirl.find_definitions
27
+
25
28
  RSpec.configure do |config|
26
29
 
27
30
  config.default_formatter = 'doc' if config.files_to_run.one?
31
+ config.include FactoryGirl::Syntax::Methods
28
32
 
29
33
  config.order = :random
30
34
 
metadata CHANGED
@@ -1,46 +1,46 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: backdrop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Bowden
8
- - Richard Vickerstaff
9
- - Adam Whittingham
10
8
  autorequire:
11
9
  bindir: bin
12
10
  cert_chain: []
13
11
  date: 2014-09-16 00:00:00.000000000 Z
14
12
  dependencies:
15
13
  - !ruby/object:Gem::Dependency
16
- name: sinatra
14
+ name: rake
17
15
  requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
21
- version: '1.4'
19
+ version: '10.1'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
23
  requirements:
26
24
  - - ~>
27
25
  - !ruby/object:Gem::Version
28
- version: '1.4'
26
+ version: '10.1'
29
27
  - !ruby/object:Gem::Dependency
30
- name: rake
28
+ name: sinatra
31
29
  requirement: !ruby/object:Gem::Requirement
32
30
  requirements:
33
31
  - - ~>
34
32
  - !ruby/object:Gem::Version
35
- version: '10.1'
33
+ version: '1.4'
36
34
  type: :runtime
37
35
  prerelease: false
38
36
  version_requirements: !ruby/object:Gem::Requirement
39
37
  requirements:
40
38
  - - ~>
41
39
  - !ruby/object:Gem::Version
42
- version: '10.1'
43
- description: Fixture generation using RAD
40
+ version: '1.4'
41
+ description: ! "Create and host fixture generation based on simple ruby\n objects
42
+ for use in local integration testing against\n multiple remote
43
+ APIs"
44
44
  email: tom.b1992@gmail.com
45
45
  executables: []
46
46
  extensions: []
@@ -49,33 +49,25 @@ files:
49
49
  - .gitignore
50
50
  - .rspec
51
51
  - .rubocop.yml
52
- - .rvmrc
52
+ - .ruby-gemset
53
+ - .ruby-version
53
54
  - .travis.yml
54
55
  - Gemfile
55
56
  - README.md
56
57
  - Rakefile
57
58
  - backdrop.gemspec
58
- - config.ru
59
59
  - lib/backdrop.rb
60
+ - lib/backdrop/api_builder.rb
60
61
  - lib/backdrop/app.rb
61
- - lib/backdrop/builders/builder.rb
62
- - lib/backdrop/builders/get.rb
63
- - lib/backdrop/builders/put.rb
64
62
  - lib/backdrop/configuration.rb
65
- - lib/backdrop/extractor.rb
66
- - lib/backdrop/rake_task.rb
67
- - lib/backdrop/runner.rb
68
63
  - lib/backdrop/version.rb
69
64
  - lib/tasks/default.rake
70
65
  - lib/tasks/rubocop.rake
71
- - spec/backdrop/builders/builder_spec.rb
72
- - spec/backdrop/builders/get_spec.rb
73
- - spec/backdrop/builders/put_spec.rb
66
+ - spec/backdrop/api_builder_spec.rb
74
67
  - spec/backdrop/configuration_spec.rb
75
- - spec/backdrop/extractor_spec.rb
76
- - spec/backdrop/runner_spec.rb
77
68
  - spec/backdrop_spec.rb
78
- - spec/integration/backdrop_spec.rb
69
+ - spec/factories/example_factory.rb
70
+ - spec/integration/backdrop_end_to_end_spec.rb
79
71
  - spec/spec_helper.rb
80
72
  homepage: http://github.com/tpbowden/backdrop
81
73
  licenses:
@@ -97,8 +89,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
89
  version: '0'
98
90
  requirements: []
99
91
  rubyforge_project:
100
- rubygems_version: 2.4.1
92
+ rubygems_version: 2.4.2
101
93
  signing_key:
102
94
  specification_version: 4
103
- summary: Fixture generation using RAD
95
+ summary: JSON Fixture generation
104
96
  test_files: []
data/config.ru DELETED
@@ -1,3 +0,0 @@
1
- require 'backdrop'
2
-
3
- Backdrop::App.run!
@@ -1,13 +0,0 @@
1
- module Backdrop
2
- class Builder
3
- def build_response(output, project, data, response)
4
- file = data['requests'].first['request_path'].split('?')[0]
5
- method = data['http_method'].downcase
6
- path = File.dirname file
7
- filename = File.basename file
8
- filepath = File.join(output, project, path)
9
- FileUtils.mkdir_p filepath
10
- File.write("#{File.join(filepath, filename)}.#{method}", response)
11
- end
12
- end
13
- end
@@ -1,15 +0,0 @@
1
- module Backdrop
2
- module Builders
3
- class Get < Builder
4
- def route(app, file)
5
- app.content_type :json
6
- File.read File.expand_path(file)
7
- end
8
-
9
- def build(output, project, data)
10
- response = data['requests'].first['response_body']
11
- build_response(output, project, data, response)
12
- end
13
- end
14
- end
15
- end
@@ -1,16 +0,0 @@
1
- module Backdrop
2
- module Builders
3
- class Put < Builder
4
- def route(app, file)
5
- app.content_type :json
6
- code = File.read File.expand_path(file)
7
- app.status code.to_i
8
- end
9
-
10
- def build(output, project, data)
11
- response = data['requests'].first['response_status']
12
- build_response(output, project, data, response)
13
- end
14
- end
15
- end
16
- end
@@ -1,27 +0,0 @@
1
- require 'json'
2
-
3
- module Backdrop
4
- class Extractor
5
- def project_name(path)
6
- path.gsub('/workspace', '').match(/\/(\w+)$/).captures.first
7
- end
8
-
9
- def load_docs(project_path)
10
- docs_dir = File.join(File.expand_path(project_path), 'doc/api')
11
- Dir["#{docs_dir}/**/*.json"]
12
- .reject { |filename| filename =~ /index\.json$/ }
13
- end
14
-
15
- def build_apis(project, rad_json, output_dir)
16
- rad_json.each do |json_file|
17
- json = JSON.parse File.read(json_file)
18
- method = json['http_method'].downcase.to_sym
19
- supported_methods = Backdrop.configuration.http.http_methods
20
- if supported_methods.include? method
21
- builder = Backdrop.configuration.http.send(method)
22
- builder.new.build output_dir, project, json
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,14 +0,0 @@
1
- require 'rake'
2
- require 'rake/tasklib'
3
- require 'backdrop'
4
-
5
- module Backdrop
6
- class RakeTask < Rake::TaskLib
7
- def initialize(output_dir, projects)
8
- desc 'Run backdrop'
9
- task :backdrop do
10
- Backdrop::Runner.new(output_dir, projects).run
11
- end
12
- end
13
- end
14
- end
@@ -1,18 +0,0 @@
1
- module Backdrop
2
- class Runner
3
- def initialize(output_dir, projects)
4
- @projects = projects
5
- @output_dir = output_dir
6
- end
7
-
8
- def run
9
- FileUtils.rm_rf @output_dir
10
- extractor = Backdrop::Extractor.new
11
- @projects.each do |project_path|
12
- project_name = extractor.project_name(project_path)
13
- json_to_emulate = extractor.load_docs(project_path)
14
- extractor.build_apis project_name, json_to_emulate, @output_dir
15
- end
16
- end
17
- end
18
- end
@@ -1,59 +0,0 @@
1
- require 'spec_helper'
2
- require 'backdrop'
3
-
4
- describe Backdrop::Builder do
5
- describe '#build_response' do
6
-
7
- before do
8
- @output_dir = Dir.mktmpdir('output')
9
- end
10
-
11
- after do
12
- FileUtils.remove_entry_secure @output_dir
13
- end
14
-
15
- context 'when the path has no query params' do
16
-
17
- let(:sample_data) do
18
- { 'http_method' => 'GET',
19
- 'route' => '/project/:property',
20
- 'requests' => [{
21
- 'request_path' => '/resource/get_request',
22
- 'response_body' => '{"Hello":"World"}'
23
- }] }
24
- end
25
- let(:project) { 'project' }
26
- let(:response) { 'some response' }
27
-
28
- it 'creates the response file with given input' do
29
- subject.build_response(@output_dir, project, sample_data, response)
30
- output = File.read(
31
- "#{File.join(@output_dir, 'project', '/resource/get_request')}.get"
32
- )
33
- expect(output).to eq response
34
- end
35
- end
36
-
37
- context 'when the path has query params' do
38
-
39
- let(:sample_data) do
40
- { 'http_method' => 'GET',
41
- 'route' => '/project/:property',
42
- 'requests' => [{
43
- 'request_path' => '/resource/get_request?query=something',
44
- 'response_body' => '{"Hello":"World"}'
45
- }] }
46
- end
47
- let(:project) { 'project' }
48
- let(:response) { 'some response' }
49
-
50
- it 'creates the response file, stripping the query params' do
51
- subject.build_response(@output_dir, project, sample_data, response)
52
- output = File.read(
53
- "#{File.join(@output_dir, 'project', '/resource/get_request')}.get"
54
- )
55
- expect(output).to eq response
56
- end
57
- end
58
- end
59
- end
@@ -1,49 +0,0 @@
1
- require 'backdrop'
2
- describe Backdrop::Builders::Get do
3
- describe '#route' do
4
- let(:app) { double :app }
5
- let(:file) { Tempfile.new 'file' }
6
-
7
- before do
8
- file.write('Hello World')
9
- file.rewind
10
- allow(app).to receive(:content_type).with(:json)
11
- end
12
-
13
- it 'sets the content type to json' do
14
- subject.route app, file
15
- expect(app).to have_received(:content_type).with :json
16
- end
17
-
18
- it 'returns the contents of the file' do
19
- expect(subject.route app, file).to eq 'Hello World'
20
- end
21
- end
22
-
23
- describe '#build' do
24
- before do
25
- @output_dir = Dir.mktmpdir('output')
26
- end
27
-
28
- after do
29
- FileUtils.remove_entry_secure @output_dir
30
- end
31
-
32
- let(:data) do
33
- { 'http_method' => 'GET',
34
- 'route' => '/project/:property',
35
- 'requests' => [{
36
- 'request_path' => '/resource/request',
37
- 'response_body' => '{"Hello":"World"}'
38
- }] }
39
- end
40
-
41
- it 'creates a file for each request' do
42
- subject.build @output_dir, 'project', data
43
- output = File.read(
44
- "#{File.join(@output_dir, 'project', 'resource/request')}.get"
45
- )
46
- expect(output).to eq '{"Hello":"World"}'
47
- end
48
- end
49
- end
@@ -1,54 +0,0 @@
1
- require 'spec_helper'
2
- require 'backdrop'
3
-
4
- describe Backdrop::Builders::Put do
5
- describe '#route' do
6
- let(:app) { double :app }
7
- let(:file) { Tempfile.new 'file' }
8
-
9
- before do
10
- file.write(200)
11
- file.rewind
12
- allow(app).to receive(:content_type).with(:json)
13
- allow(app).to receive(:status).with 200
14
- end
15
- it 'sets the content type to json' do
16
- subject.route app, file
17
- expect(app).to have_received(:content_type).with(:json)
18
- end
19
-
20
- it 'sets the status code to the contents of file' do
21
- subject.route app, file
22
- expect(app).to have_received(:status).with 200
23
- end
24
- end
25
-
26
- describe '#build' do
27
-
28
- before do
29
- @output_dir = Dir.mktmpdir('output')
30
- end
31
-
32
- after do
33
- FileUtils.remove_entry_secure @output_dir
34
- end
35
-
36
- let(:data) do
37
- { 'http_method' => 'PUT',
38
- 'route' => '/project/:property',
39
- 'requests' => [{
40
- 'request_path' => '/resource/request',
41
- 'response_body' => '{"Hello":"World"}',
42
- 'response_status' => 201
43
- }] }
44
- end
45
-
46
- it 'creates a file with the status for each request' do
47
- subject.build @output_dir, 'project', data
48
- output = File.read(
49
- "#{File.join(@output_dir, 'project', '/resource/request')}.put"
50
- )
51
- expect(output).to eq '201'
52
- end
53
- end
54
- end
@@ -1,81 +0,0 @@
1
- require 'spec_helper'
2
- require 'backdrop'
3
- require 'tmpdir'
4
- require 'tempfile'
5
-
6
- describe Backdrop::Extractor do
7
-
8
- describe '#project_name' do
9
- context 'when running a normal project' do
10
- let(:file_path) { '/files/projects/name' }
11
-
12
- it 'works out the project name based on its path' do
13
- expect(subject.project_name(file_path)).to eq 'name'
14
- end
15
- end
16
-
17
- context 'when running a project on Jenkins' do
18
- let(:file_path) { '/files/projects/jenkins_project/workspace' }
19
- it 'strips workspace/ from the path (for Jenkins builds)' do
20
- expect(subject.project_name(file_path)).to eq 'jenkins_project'
21
- end
22
- end
23
- end
24
-
25
- describe '#build_apis' do
26
- let(:builder) { double :builder }
27
-
28
- context 'when the method is defined' do
29
- let(:json) { { 'http_method' => 'GET' } }
30
-
31
- before do
32
- allow(Backdrop::Builders::Get).to receive(:new)
33
- .and_return builder
34
- @json_file = Tempfile.new 'file.json'
35
- @json_file.write(JSON.generate json)
36
- @json_file.rewind
37
- end
38
-
39
- it 'creates an API for each request' do
40
- expect(builder).to receive(:build).with('output', 'project', json)
41
- subject.build_apis 'project', [@json_file.path], 'output'
42
- end
43
- end
44
-
45
- context 'when the method is not defined' do
46
- let(:json) { { 'http_method' => 'SOMETHING' } }
47
-
48
- before do
49
- allow(Backdrop::Builders::Get).to receive(:new)
50
- .and_return builder
51
- @json_file = Tempfile.new 'file.json'
52
- @json_file.write(JSON.generate json)
53
- @json_file.rewind
54
- end
55
-
56
- it 'creates an API for each request' do
57
- expect(builder).to_not receive(:build)
58
- subject.build_apis 'project', [@json_file.path], 'output'
59
- end
60
- end
61
- end
62
-
63
- describe '#load_docs' do
64
- before do
65
- @dir = Dir.mktmpdir
66
- FileUtils.mkdir_p("#{@dir}/doc/api")
67
- File.write("#{@dir}/doc/api/index.json", '{"hello":"world"}')
68
- File.write("#{@dir}/doc/api/api.json", '{"json":"api"}')
69
- end
70
-
71
- after do
72
- FileUtils.remove_entry_secure @dir
73
- end
74
-
75
- it 'loads the files but excludes the index.json' do
76
- expect(subject.load_docs(@dir)).to match_array([
77
- "#{@dir}/doc/api/api.json"
78
- ])
79
- end
80
- end
81
- end
@@ -1,31 +0,0 @@
1
- require 'spec_helper'
2
- require 'backdrop'
3
-
4
- describe Backdrop::Runner do
5
-
6
- let(:output_dir) { '/fixtures' }
7
- let(:project_paths) { ['/project/path'] }
8
- let(:project_name) { 'path' }
9
- let(:rad_docs) { ['file.json'] }
10
- let(:subject) { Backdrop::Runner.new(output_dir, project_paths) }
11
-
12
- describe '#run' do
13
- let(:extractor) do
14
- double :extractor, project_name: project_name, load_docs: rad_docs
15
- end
16
- let(:builder) { double :builder }
17
-
18
- before do
19
- allow(Backdrop::Extractor).to receive(:new).and_return extractor
20
- end
21
-
22
- it 'works out the project name' do
23
- expect(extractor).to receive(:build_apis).with(
24
- project_name,
25
- rad_docs,
26
- output_dir
27
- )
28
- subject.run
29
- end
30
- end
31
- end
@@ -1,73 +0,0 @@
1
- require 'spec_helper'
2
- require 'backdrop'
3
- require 'tmpdir'
4
- require 'rack/test'
5
-
6
- describe 'Backdrop' do
7
- include Rack::Test::Methods
8
-
9
- before(:all) do
10
- @test_dir = Dir.mktmpdir
11
- end
12
-
13
- after(:all) do
14
- FileUtils.remove_entry_secure @test_dir
15
- end
16
- let(:subject) { Backdrop::Runner.new(output_path, [project_path]) }
17
- let(:output_path) { File.join(@test_dir, 'output') }
18
- let(:project_path) { File.join(@test_dir, 'project') }
19
-
20
- def app
21
- Backdrop.configure do |config|
22
- config.output_dir = output_path
23
- end
24
- Backdrop::App
25
- end
26
-
27
- describe 'running with an out directory and API project' do
28
- let(:put_output) do
29
- { 'http_method' => 'PUT',
30
- 'route' => 'resource/:property',
31
- 'requests' => [{
32
- 'response_body' => nil,
33
- 'request_path' => '/resource/put_request',
34
- 'response_status' => 201
35
- }] }
36
- end
37
-
38
- let(:get_output) do
39
- { 'http_method' => 'GET',
40
- 'route' => '/resource/:property',
41
- 'requests' => [{
42
- 'request_path' => '/resource/get_request',
43
- 'response_body' => '{"Hello":"World"}'
44
- }] }
45
- end
46
- before do
47
- FileUtils.mkdir_p(File.join(project_path, 'doc/api/resource'))
48
- File.write(
49
- File.join(project_path, '/doc/api/put_request.json'),
50
- JSON.generate(put_output)
51
- )
52
- File.write(
53
- File.join(project_path, '/doc/api/get_request.json'),
54
- JSON.generate(get_output)
55
- )
56
- subject.run
57
- end
58
-
59
- context 'when the method is PUT' do
60
- it 'responds with the correct status' do
61
- put '/project/resource/put_request'
62
- expect(last_response.status).to eq 201
63
- end
64
- end
65
-
66
- context 'when the method is GET' do
67
- it 'responds with the response body' do
68
- get '/project/resource/get_request'
69
- expect(last_response.body).to eq '{"Hello":"World"}'
70
- end
71
- end
72
- end
73
- end