pact_broker 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/CHANGELOG.md +14 -0
  2. data/Gemfile.lock +11 -9
  3. data/lib/pact_broker/api/decorators/base_decorator.rb +1 -1
  4. data/lib/pact_broker/api/decorators/latest_pact_decorator.rb +24 -0
  5. data/lib/pact_broker/api/decorators/pact_collection_decorator.rb +3 -3
  6. data/lib/pact_broker/api/decorators/pact_decorator.rb +1 -1
  7. data/lib/pact_broker/api/decorators/pact_pacticipant_decorator.rb +1 -1
  8. data/lib/pact_broker/api/decorators/pacticipant_collection_decorator.rb +1 -1
  9. data/lib/pact_broker/api/decorators/tag_decorator.rb +19 -0
  10. data/lib/pact_broker/api/decorators.rb +2 -1
  11. data/lib/pact_broker/api/{decorators/pact_broker_urls.rb → pact_broker_urls.rb} +14 -1
  12. data/lib/pact_broker/api/resources/base_resource.rb +14 -1
  13. data/lib/pact_broker/api/resources/latest_pacts.rb +1 -1
  14. data/lib/pact_broker/api/resources/pact.rb +3 -9
  15. data/lib/pact_broker/api/resources/pacticipant.rb +8 -21
  16. data/lib/pact_broker/api/resources/pacticipants.rb +1 -1
  17. data/lib/pact_broker/api/resources/tag.rb +44 -0
  18. data/lib/pact_broker/api.rb +2 -0
  19. data/lib/pact_broker/logging.rb +4 -0
  20. data/lib/pact_broker/models/tag.rb +5 -0
  21. data/lib/pact_broker/repositories/tag_repository.rb +25 -0
  22. data/lib/pact_broker/repositories/version_repository.rb +8 -0
  23. data/lib/pact_broker/repositories.rb +5 -0
  24. data/lib/pact_broker/services/pacticipant_service.rb +9 -9
  25. data/lib/pact_broker/services/tag_service.rb +25 -0
  26. data/lib/pact_broker/services.rb +5 -0
  27. data/lib/pact_broker/version.rb +1 -1
  28. data/pact_broker.gemspec +1 -1
  29. data/spec/lib/pact_broker/api/decorators/pact_collection_decorator_spec.rb +2 -2
  30. data/spec/lib/pact_broker/api/resources/tag_spec.rb +118 -0
  31. data/spec/lib/pact_broker/repositories/tag_repository_spec.rb +53 -0
  32. data/spec/lib/pact_broker/repositories/version_repository_spec.rb +38 -0
  33. data/spec/lib/pact_broker/services/tag_service_spec.rb +31 -0
  34. data/spec/service_consumers/pact_helper.rb +1 -0
  35. data/spec/service_consumers/provider_states_for_pact_broker_client.rb +9 -0
  36. data/spec/spec_helper.rb +10 -0
  37. data/spec/support/provider_state_builder.rb +25 -0
  38. metadata +22 -9
data/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@ Do this to generate your change history
2
2
 
3
3
  $ git log --date=relative --pretty=format:' * %h - %s (%an, %ad)' 'package/pact-broker-0.0.PRODVERSION'..'package/pact-broker-0.0.NEWVERSION'
4
4
 
5
+ #### 0.0.10 (2014-03-24)
6
+
7
+ * 7aee2ae - Implemented version tagging (Beth, 2 days ago)
8
+ * cc78f92 - Added 'latest' pact url to pact representation in the 'latest pacts' response (Beth, 2 days ago)
9
+
10
+ #### 0.0.9 (2014-02-27)
11
+
12
+ * d07f4b7 - Using default gem publish tasks (Beth, 4 weeks ago)
13
+ * d60b7ee - Comment (Beth, 7 weeks ago)
14
+ * 836347c - Using local pacts (Beth, 7 weeks ago)
15
+ * a2cb2bb - Fixed bug querying mysql DB, rather than sqlite (Beth, 7 weeks ago)
16
+ * 9d5f83b - Using the to_json options to pass in the base_url instead of the nasty hack. (Beth, 4 months ago)
17
+ * adb6148 - Changed 'last' to 'latest' (Beth, 4 months ago)
18
+
5
19
  #### 0.0.8 (2013-11-18)
6
20
 
7
21
  * 6022baa - Changed name to title in list pacticipants response (Beth, 7 hours ago)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pact_broker (0.0.9)
4
+ pact_broker (0.0.10)
5
5
  httparty
6
6
  json
7
7
  roar
@@ -20,6 +20,7 @@ GEM
20
20
  ci_reporter (1.9.0)
21
21
  builder (>= 2.1.2)
22
22
  coderay (1.0.9)
23
+ colored (1.2)
23
24
  columnize (0.3.6)
24
25
  debugger (1.6.2)
25
26
  columnize (>= 0.3.1)
@@ -30,7 +31,7 @@ GEM
30
31
  diff-lcs (1.2.5)
31
32
  fakefs (0.4.3)
32
33
  find_a_port (1.0.1)
33
- httparty (0.12.0)
34
+ httparty (0.13.0)
34
35
  json (~> 1.8)
35
36
  multi_xml (>= 0.5.2)
36
37
  i18n (0.6.9)
@@ -41,8 +42,9 @@ GEM
41
42
  multi_xml (0.5.5)
42
43
  nokogiri (1.6.1)
43
44
  mini_portile (~> 0.5.0)
44
- pact (1.0.26)
45
+ pact (1.1.0.rc1)
45
46
  awesome_print (~> 1.1)
47
+ colored
46
48
  find_a_port (~> 1.0.1)
47
49
  json
48
50
  rack-test (~> 0.6.2)
@@ -59,11 +61,11 @@ GEM
59
61
  rack (>= 1.0)
60
62
  rake (10.0.4)
61
63
  randexp (0.1.7)
62
- representable (1.6.1)
64
+ representable (1.7.7)
63
65
  multi_json
64
66
  nokogiri
65
- roar (0.12.0)
66
- representable (~> 1.6.0)
67
+ roar (0.12.4)
68
+ representable (>= 1.6.0)
67
69
  rspec (2.14.1)
68
70
  rspec-core (~> 2.14.0)
69
71
  rspec-expectations (~> 2.14.0)
@@ -74,7 +76,7 @@ GEM
74
76
  rspec-fire (1.2.0)
75
77
  rspec (~> 2.11)
76
78
  rspec-mocks (2.14.4)
77
- sequel (4.7.0)
79
+ sequel (4.8.0)
78
80
  shotgun (0.9)
79
81
  rack (>= 1.0)
80
82
  simplecov (0.7.1)
@@ -82,7 +84,7 @@ GEM
82
84
  simplecov-html (~> 0.7.1)
83
85
  simplecov-html (0.7.1)
84
86
  slop (3.4.6)
85
- sqlite3 (1.3.8)
87
+ sqlite3 (1.3.9)
86
88
  thor (0.18.1)
87
89
  versionomy (0.4.4)
88
90
  blockenspiel (>= 0.4.5)
@@ -99,7 +101,7 @@ DEPENDENCIES
99
101
  ci_reporter
100
102
  debugger
101
103
  fakefs (~> 0.4)
102
- pact
104
+ pact (= 1.1.0.rc1)
103
105
  pact_broker!
104
106
  pry
105
107
  rake (~> 10.0.3)
@@ -1,6 +1,6 @@
1
1
  require 'roar/decorator'
2
2
  require 'roar/representer/json/hal'
3
- require 'pact_broker/api/decorators/pact_broker_urls'
3
+ require 'pact_broker/api/pact_broker_urls'
4
4
 
5
5
  module PactBroker
6
6
 
@@ -0,0 +1,24 @@
1
+ require_relative 'pact_decorator'
2
+
3
+ module PactBroker
4
+
5
+ module Api
6
+
7
+ module Decorators
8
+
9
+ class LatestPactDecorator < PactDecorator
10
+
11
+ links :self do | options |
12
+ [
13
+ {
14
+ href: latest_pact_url(options[:base_url], represented)
15
+ },{
16
+ href: pact_url(options[:base_url], represented)
17
+ }
18
+ ]
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,6 +1,6 @@
1
1
  require_relative 'base_decorator'
2
2
  require_relative 'version_decorator'
3
- require_relative 'pact_decorator'
3
+ require_relative 'latest_pact_decorator'
4
4
  require_relative 'representable_pact'
5
5
 
6
6
  module PactBroker
@@ -9,11 +9,11 @@ module PactBroker
9
9
 
10
10
  module Decorators
11
11
 
12
- class PactCollectionRepresenter < BaseDecorator
12
+ class PactCollectionDecorator < BaseDecorator
13
13
  include Roar::Representer::JSON::HAL
14
14
  include PactBroker::Api::PactBrokerUrls
15
15
 
16
- collection :pacts, decorator_scope: true, :class => PactBroker::Models::Pact, :extend => PactBroker::Api::Decorators::PactRepresenter
16
+ collection :pacts, decorator_scope: true, :class => PactBroker::Models::Pact, :extend => PactBroker::Api::Decorators::LatestPactDecorator
17
17
 
18
18
  def pacts
19
19
  represented.collect{ | pact | create_representable_pact(pact) }
@@ -7,7 +7,7 @@ module PactBroker
7
7
 
8
8
  module Decorators
9
9
 
10
- class PactRepresenter < BaseDecorator
10
+ class PactDecorator < BaseDecorator
11
11
 
12
12
  property :consumer, :extend => PactBroker::Api::Decorators::PactPacticipantRepresenter, :embedded => true
13
13
  property :provider, :extend => PactBroker::Api::Decorators::PactPacticipantRepresenter, :embedded => true
@@ -1,4 +1,4 @@
1
- require_relative 'pact_broker_urls'
1
+ require 'pact_broker/api/pact_broker_urls'
2
2
  require_relative 'version_decorator'
3
3
  require_relative 'base_decorator'
4
4
 
@@ -1,5 +1,5 @@
1
1
  require 'roar/representer/json/hal'
2
- require_relative 'pact_broker_urls'
2
+ require 'pact_broker/api/pact_broker_urls'
3
3
  require_relative 'version_decorator'
4
4
 
5
5
  module Roar
@@ -0,0 +1,19 @@
1
+ require_relative 'base_decorator'
2
+ require_relative 'pact_pacticipant_decorator'
3
+
4
+ module PactBroker
5
+
6
+ module Api
7
+
8
+ module Decorators
9
+
10
+ class TagDecorator < BaseDecorator
11
+
12
+ link :self do | options |
13
+ tag_url(options[:base_url], represented)
14
+ end
15
+
16
+ end
17
+ end
18
+ end
19
+ end
@@ -3,4 +3,5 @@ require 'pact_broker/api/decorators/pacticipant_collection_decorator'
3
3
  require 'pact_broker/api/decorators/version_decorator'
4
4
  require 'pact_broker/api/decorators/pact_collection_decorator'
5
5
  require 'pact_broker/api/decorators/pact_pacticipant_decorator'
6
- require 'pact_broker/api/decorators/pact_decorator'
6
+ require 'pact_broker/api/decorators/pact_decorator'
7
+ require 'pact_broker/api/decorators/tag_decorator'
@@ -23,7 +23,8 @@ module PactBroker
23
23
  end
24
24
 
25
25
  def pact_url base_url, pact
26
- "#{pactigration_base_url(base_url, pact)}/version/#{pact.consumer.version.number}"
26
+ representable_pact = representable_pact(pact)
27
+ "#{pactigration_base_url(base_url, representable_pact)}/version/#{representable_pact.consumer.version.number}"
27
28
  end
28
29
 
29
30
  def latest_pact_url base_url, pact
@@ -34,8 +35,20 @@ module PactBroker
34
35
  "#{base_url}/pacts/latest"
35
36
  end
36
37
 
38
+ def tags_url base_url, version
39
+ "#{version_url(base_url, version)}/tags"
40
+ end
41
+
42
+ def tag_url base_url, tag
43
+ "#{tags_url(base_url, tag.version)}/#{tag.name}"
44
+ end
45
+
37
46
  private
38
47
 
48
+ def representable_pact pact
49
+ Decorators::RepresentablePact === pact ? pact : Decorators::RepresentablePact.new(pact)
50
+ end
51
+
39
52
  def pactigration_base_url base_url, pact
40
53
  "#{base_url}/pact/provider/#{url_encode(pact.provider.name)}/consumer/#{url_encode(pact.consumer.name)}"
41
54
  end
@@ -1,13 +1,21 @@
1
1
  require 'webmachine'
2
2
  require 'pact_broker/services'
3
3
  require 'pact_broker/api/decorators'
4
+ require 'pact_broker/logging'
5
+ require 'pact_broker/api/pact_broker_urls'
4
6
 
5
7
  module PactBroker::Api
6
8
 
7
9
  module Resources
8
10
 
11
+
9
12
  class ErrorHandler
13
+
14
+ include PactBroker::Logging
15
+
10
16
  def self.handle_exception e, response
17
+ logger.error e
18
+ logger.error e.backtrace
11
19
  response.body = {:message => e.message, :backtrace => e.backtrace }.to_json
12
20
  response.code = 500
13
21
  end
@@ -16,6 +24,7 @@ module PactBroker::Api
16
24
  class BaseResource < Webmachine::Resource
17
25
 
18
26
  include PactBroker::Services
27
+ include PactBroker::Api::PactBrokerUrls
19
28
 
20
29
  def identifier_from_path
21
30
  request.path_info.each_with_object({}) do | pair, hash|
@@ -23,13 +32,17 @@ module PactBroker::Api
23
32
  end
24
33
  end
25
34
 
26
- def request_base_url
35
+ def resource_url
27
36
  request.uri.to_s.gsub(/#{request.uri.path}$/,'')
28
37
  end
29
38
 
30
39
  def handle_exception e
31
40
  PactBroker::Api::Resources::ErrorHandler.handle_exception(e, response)
32
41
  end
42
+
43
+ def params
44
+ JSON.parse(request.body.to_s, symbolize_names: true)
45
+ end
33
46
  end
34
47
  end
35
48
  end
@@ -19,7 +19,7 @@ module PactBroker::Api
19
19
  end
20
20
 
21
21
  def generate_json pacts
22
- PactBroker::Api::Decorators::PactCollectionRepresenter.new(pacts).to_json(base_url: request_base_url)
22
+ PactBroker::Api::Decorators::PactCollectionDecorator.new(pacts).to_json(base_url: resource_url)
23
23
  end
24
24
 
25
25
  end
@@ -25,15 +25,9 @@ module PactBroker::Api
25
25
  end
26
26
 
27
27
  def from_json
28
- pact, created = pact_service.create_or_update_pact(identifier_from_path.merge(:json_content => pact_content))
29
- response.body = pact.json_content
30
- @manual_response_code = 201 if created
31
- end
32
-
33
- def finish_request
34
- if @manual_response_code
35
- response.code = @manual_response_code
36
- end
28
+ @pact, created = pact_service.create_or_update_pact(identifier_from_path.merge(:json_content => pact_content))
29
+ response.headers["Location"] = pact_url(resource_url, @pact) if created
30
+ response.body = to_json
37
31
  end
38
32
 
39
33
  def to_json
@@ -31,12 +31,13 @@ module PactBroker::Api
31
31
  end
32
32
 
33
33
  def from_json
34
- pacticipant, created = pacticipant_service.create_or_update_pacticipant(
35
- name: identifier_from_path[:name],
36
- repository_url: params[:repository_url]
37
- )
38
- @manual_response_code = 201 if created
39
- response.body = generate_json(pacticipant)
34
+ if @pacticipant
35
+ @pacticipant = pacticipant_service.update params.merge(name: identifier_from_path[:name])
36
+ else
37
+ @pacticipant = pacticipant_service.create params.merge(name: identifier_from_path[:name])
38
+ response.headers["Location"] = pacticipant_url(resource_url, @pacticipant)
39
+ end
40
+ response.body = to_json
40
41
  end
41
42
 
42
43
  def resource_exists?
@@ -44,22 +45,8 @@ module PactBroker::Api
44
45
  @pacticipant != nil
45
46
  end
46
47
 
47
- def finish_request
48
- if @manual_response_code
49
- response.code = @manual_response_code
50
- end
51
- end
52
-
53
48
  def to_json
54
- generate_json(@pacticipant)
55
- end
56
-
57
- def generate_json pacticipant
58
- PactBroker::Api::Decorators::PacticipantRepresenter.new(pacticipant).to_json(base_url: request_base_url)
59
- end
60
-
61
- def params
62
- JSON.parse(request.body.to_s)
49
+ PactBroker::Api::Decorators::PacticipantRepresenter.new(@pacticipant).to_json(base_url: resource_url)
63
50
  end
64
51
 
65
52
  end
@@ -19,7 +19,7 @@ module PactBroker::Api
19
19
  end
20
20
 
21
21
  def generate_json pacticipants
22
- PactBroker::Api::Decorators::PacticipantCollectionRepresenter.new(pacticipants).to_json(base_url: request_base_url)
22
+ PactBroker::Api::Decorators::PacticipantCollectionRepresenter.new(pacticipants).to_json(base_url: resource_url)
23
23
  end
24
24
 
25
25
  end
@@ -0,0 +1,44 @@
1
+ require 'pact_broker/api/resources/base_resource'
2
+
3
+ module PactBroker::Api
4
+
5
+ module Resources
6
+
7
+ class Tag < BaseResource
8
+
9
+ def content_types_provided
10
+ [["application/hal+json", :to_json]]
11
+ end
12
+
13
+ def content_types_accepted
14
+ [["application/json", :from_json]]
15
+ end
16
+
17
+ def allowed_methods
18
+ ["GET","PUT"]
19
+ end
20
+
21
+ def from_json
22
+ unless @tag
23
+ @tag = tag_service.create identifier_from_path
24
+ response.headers["Location"] = tag_url(resource_url, @tag)
25
+ end
26
+ response.body = generate_json @tag
27
+ end
28
+
29
+ def resource_exists?
30
+ @tag = tag_service.find identifier_from_path
31
+ end
32
+
33
+ def to_json
34
+ generate_json(@tag)
35
+ end
36
+
37
+ def generate_json tag
38
+ PactBroker::Api::Decorators::TagDecorator.new(tag).to_json(base_url: resource_url)
39
+ end
40
+
41
+ end
42
+ end
43
+
44
+ end
@@ -3,6 +3,7 @@ require 'pact_broker/api/resources/latest_pact'
3
3
  require 'pact_broker/api/resources/latest_pacts'
4
4
  require 'pact_broker/api/resources/pacticipant'
5
5
  require 'pact_broker/api/resources/pacticipants'
6
+ require 'pact_broker/api/resources/tag'
6
7
  require 'pact_broker/api/resources/index'
7
8
 
8
9
  require 'webmachine/adapters/rack'
@@ -18,6 +19,7 @@ module PactBroker
18
19
  add ['pacts', 'latest'], Api::Resources::LatestPacts
19
20
  add ['pacticipants'], Api::Resources::Pacticipants
20
21
  add ['pacticipants', :name], Api::Resources::Pacticipant
22
+ add ['pacticipants', :pacticipant_name, 'versions', :pacticipant_version_number, 'tags', :tag_name], Api::Resources::Tag
21
23
  add [], Api::Resources::Index
22
24
  end
23
25
  end
@@ -12,6 +12,10 @@ module PactBroker
12
12
  base.extend(self)
13
13
  end
14
14
 
15
+ def logger= logger
16
+ @@logger = logger
17
+ end
18
+
15
19
  def logger
16
20
  @@logger ||= begin
17
21
  FileUtils.mkdir_p(LOG_DIR)
@@ -5,6 +5,11 @@ module PactBroker
5
5
  module Models
6
6
  class Tag < Sequel::Model
7
7
 
8
+ unrestrict_primary_key
9
+
10
+ associate(:many_to_one, :version, :class => "PactBroker::Models::Version", :key => :version_id, :primary_key => :id)
11
+
12
+
8
13
  end
9
14
  end
10
15
  end
@@ -0,0 +1,25 @@
1
+ require 'pact_broker/models/tag'
2
+
3
+ module PactBroker
4
+ module Repositories
5
+ class TagRepository
6
+
7
+
8
+ def create args
9
+ Models::Tag.new(name: args.fetch(:name), version: args.fetch(:version)).save
10
+ end
11
+
12
+ def find args
13
+ PactBroker::Models::Tag
14
+ .select(:tags__name, :tags__version_id)
15
+ .join(:versions, {id: :version_id})
16
+ .join(:pacticipants, {pacticipants__id: :versions__pacticipant_id})
17
+ .where(:tags__name => args.fetch(:tag_name))
18
+ .where(:versions__number => args.fetch(:pacticipant_version_number))
19
+ .where(:pacticipants__name => args.fetch(:pacticipant_name))
20
+ .single_record
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -9,6 +9,14 @@ module PactBroker
9
9
  PactBroker::Models::Version.where(number: number, pacticipant_id: pacticipant_id).single_record
10
10
  end
11
11
 
12
+ def find_by_pacticipant_name_and_number pacticipant_name, number
13
+ PactBroker::Models::Version
14
+ .where(number: number)
15
+ .join(:pacticipants, {id: :pacticipant_id})
16
+ .where(name: pacticipant_name)
17
+ .single_record
18
+ end
19
+
12
20
  def create args
13
21
  PactBroker.logger.info "Creating version #{args[:number]} for pacticipant_id=#{args[:pacticipant_id]}"
14
22
  PactBroker::Models::Version.new(number: args[:number], pacticipant_id: args[:pacticipant_id]).save
@@ -2,6 +2,7 @@ require 'pact_broker/models'
2
2
  require 'pact_broker/repositories/pacticipant_repository'
3
3
  require 'pact_broker/repositories/version_repository'
4
4
  require 'pact_broker/repositories/pact_repository'
5
+ require 'pact_broker/repositories/tag_repository'
5
6
 
6
7
  module PactBroker
7
8
  module Repositories
@@ -17,6 +18,10 @@ module PactBroker
17
18
  PactRepository.new
18
19
  end
19
20
 
21
+ def tag_repository
22
+ TagRepository.new
23
+ end
24
+
20
25
  extend self
21
26
  end
22
27
  end
@@ -24,16 +24,16 @@ module PactBroker
24
24
  end
25
25
  end
26
26
 
27
- def self.create_or_update_pacticipant params
28
- pacticipant = pacticipant_repository.find_by_name(params[:name])
29
- if pacticipant
30
- pacticipant.update(repository_url: params[:repository_url])
31
- return pacticipant, false
32
- else
33
- pacticipant = pacticipant_repository.create(name: params[:name], repository_url: params[:repository_url])
34
- return pacticipant, true
35
- end
27
+ def self.update params
28
+ pacticipant = pacticipant_repository.find_by_name(params.fetch(:name))
29
+ pacticipant.update(params)
30
+ pacticipant_repository.find_by_name(params.fetch(:name))
36
31
  end
32
+
33
+ def self.create params
34
+ pacticipant_repository.create(params)
35
+ end
36
+
37
37
  end
38
38
  end
39
39
  end
@@ -0,0 +1,25 @@
1
+ require 'pact_broker/repositories'
2
+
3
+ module PactBroker
4
+
5
+ module Services
6
+ module TagService
7
+
8
+ extend self
9
+
10
+ extend PactBroker::Repositories
11
+
12
+ def create args
13
+ pacticipant = pacticipant_repository.find_by_name_or_create args.fetch(:pacticipant_name)
14
+ version = version_repository.find_by_pacticipant_id_and_number_or_create pacticipant.id, args.fetch(:pacticipant_version_number)
15
+ tag_repository.create version: version, name: args.fetch(:tag_name)
16
+ end
17
+
18
+ def find args
19
+ tag_repository.find args
20
+ end
21
+
22
+ end
23
+ end
24
+
25
+ end
@@ -1,5 +1,6 @@
1
1
  require 'pact_broker/services/pact_service'
2
2
  require 'pact_broker/services/pacticipant_service'
3
+ require 'pact_broker/services/tag_service'
3
4
 
4
5
  module PactBroker
5
6
  module Services
@@ -10,5 +11,9 @@ module PactBroker
10
11
  def pacticipant_service
11
12
  PacticipantService
12
13
  end
14
+
15
+ def tag_service
16
+ TagService
17
+ end
13
18
  end
14
19
  end
@@ -1,3 +1,3 @@
1
1
  module PactBroker
2
- VERSION = '0.0.9'
2
+ VERSION = '0.0.10'
3
3
  end
data/pact_broker.gemspec CHANGED
@@ -36,5 +36,5 @@ Gem::Specification.new do |gem|
36
36
  gem.add_development_dependency 'ci_reporter'
37
37
  gem.add_development_dependency 'simplecov'
38
38
  gem.add_development_dependency 'shotgun'
39
- gem.add_development_dependency 'pact'
39
+ gem.add_development_dependency 'pact', '1.1.0.rc1'
40
40
  end
@@ -5,7 +5,7 @@ require 'pact_broker/api/decorators'
5
5
 
6
6
  module PactBroker::Api::Decorators
7
7
 
8
- describe PactCollectionRepresenter do
8
+ describe PactCollectionDecorator do
9
9
 
10
10
  let(:pact) do
11
11
  provider = PactBroker::Models::Pacticipant.create(:name => 'Pricing Service')
@@ -16,7 +16,7 @@ module PactBroker::Api::Decorators
16
16
  end
17
17
 
18
18
  xit "should description" do
19
- puts PactCollectionRepresenter.new([pact]).to_json
19
+ puts PactCollectionDecorator.new([pact]).to_json
20
20
  end
21
21
  end
22
22
 
@@ -0,0 +1,118 @@
1
+ require 'spec_helper'
2
+ require 'pact_broker/api/resources/tag'
3
+
4
+ module PactBroker
5
+ module Api
6
+
7
+ module Resources
8
+
9
+ describe Tag do
10
+
11
+ let(:tag) { double("PactBroker::Models::Tag") }
12
+ let(:tag_decorator) { instance_double("PactBroker::Api::Decorators::TagDecorator", :to_json => tag_json) }
13
+ let(:tag_json) { {"some" => "tag"}.to_json }
14
+ let(:tag_attributes) {
15
+ {
16
+ :pacticipant_name => "Condor",
17
+ :pacticipant_version_number => "1.3.0",
18
+ :tag_name => "prod"
19
+ }
20
+ }
21
+
22
+ describe "GET" do
23
+ before do
24
+ allow(Services::TagService).to receive(:find).and_return(tag)
25
+ allow(PactBroker::Api::Decorators::TagDecorator).to receive(:new).and_return(tag_decorator)
26
+ end
27
+
28
+ subject { get("/pacticipants/Condor/versions/1.3.0/tags/prod" ) }
29
+
30
+ context "when the tag exists" do
31
+
32
+ it "renders the tag" do
33
+ subject
34
+ expect(last_response.body).to eq tag_json
35
+ end
36
+
37
+ it "returns a success response" do
38
+ subject
39
+ expect(last_response).to be_successful
40
+ end
41
+
42
+ end
43
+
44
+ context "when the tag does not exist" do
45
+ let(:tag) { nil }
46
+
47
+ it "returns a 404" do
48
+ subject
49
+ expect(last_response.status).to eq 404
50
+ end
51
+ end
52
+ end
53
+
54
+ describe "PUT" do
55
+
56
+ let(:tag_url) { 'http://example.org/tag/url'}
57
+
58
+ before do
59
+ allow_any_instance_of(PactBroker::Api::Resources::Tag).to receive(:tag_url).and_return(tag_url)
60
+ allow(Services::TagService).to receive(:find).and_return(tag)
61
+ allow(PactBroker::Api::Decorators::TagDecorator).to receive(:new).and_return(tag_decorator)
62
+ end
63
+
64
+ subject { put("/pacticipants/Condor/versions/1.3.0/tags/prod", nil, "CONTENT_LENGTH" => "0", "CONTENT_TYPE" => "application/json") }
65
+
66
+ it "returns a success response" do
67
+ subject
68
+ expect(last_response).to be_successful
69
+ end
70
+
71
+ context "when the tag already exists" do
72
+
73
+ it "returns a 200" do
74
+ subject
75
+ expect(last_response.status).to be 200
76
+ end
77
+
78
+ it "renders the tag" do
79
+ expect(tag_decorator).to receive(:to_json).with(base_url: "http://example.org")
80
+ subject
81
+ expect(last_response.body).to eq tag_json
82
+ end
83
+
84
+ end
85
+
86
+ context "when the tag does not exist" do
87
+ before do
88
+ allow(Services::TagService).to receive(:find).and_return(nil)
89
+ allow(Services::TagService).to receive(:create).and_return(tag)
90
+ end
91
+
92
+
93
+ it "creates the tag" do
94
+ expect(Services::TagService).to receive(:create).with(tag_attributes)
95
+ subject
96
+ end
97
+
98
+ it "returns a 201" do
99
+ subject
100
+ expect(last_response.status).to be 201
101
+ end
102
+
103
+ it "renders the tag" do
104
+ expect(tag_decorator).to receive(:to_json).with(base_url: "http://example.org")
105
+ subject
106
+ expect(last_response.body).to eq tag_json
107
+ end
108
+
109
+ end
110
+
111
+
112
+ end
113
+
114
+ end
115
+
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+ require 'pact_broker/repositories/tag_repository'
3
+
4
+ module PactBroker
5
+ module Repositories
6
+ describe TagRepository do
7
+
8
+ describe ".find" do
9
+
10
+ let(:pacticipant_name) { "test_pacticipant" }
11
+ let(:version_number) { "1.2.3" }
12
+ let(:tag_name) { "prod" }
13
+
14
+ subject { TagRepository.new }
15
+ let(:options) { {pacticipant_name: pacticipant_name, pacticipant_version_number: version_number, tag_name: tag_name} }
16
+ let(:find_tag) { subject.find options }
17
+
18
+ let!(:provider_state_builder) do
19
+ ProviderStateBuilder.new
20
+ .create_pacticipant("wrong_pacticipant")
21
+ .create_version(version_number)
22
+ .create_tag(tag_name) #Tag with wrong pacticipant
23
+ .create_pacticipant(pacticipant_name)
24
+ .create_version("2.0.0")
25
+ .create_tag(tag_name) # Tag with wrong version number
26
+ .create_version(version_number)
27
+ .create_tag("wrong tag") #Tag with wrong name
28
+ end
29
+
30
+ context "when the tag exists" do
31
+
32
+ before do
33
+ provider_state_builder.create_tag(tag_name) # Right tag!
34
+ end
35
+
36
+ it "returns the tag" do
37
+ expect(find_tag.name).to eq tag_name
38
+ expect(find_tag.version.number).to eq version_number
39
+ expect(find_tag.version.pacticipant.name).to eq pacticipant_name
40
+ end
41
+
42
+ end
43
+
44
+ context "when the tag does not exist" do
45
+ it "returns nil" do
46
+ expect(find_tag).to be_nil
47
+ end
48
+ end
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+ require 'pact_broker/repositories/version_repository'
3
+
4
+ module PactBroker
5
+ module Repositories
6
+ describe VersionRepository do
7
+
8
+ describe "#find_by_pacticipant_name_and_number" do
9
+
10
+ let(:pacticipant_name) { "test_pacticipant" }
11
+ let(:version_number) { "1.2.3" }
12
+
13
+ subject { described_class.new.find_by_pacticipant_name_and_number pacticipant_name, version_number }
14
+
15
+ context "when the version exists" do
16
+ before do
17
+ ProviderStateBuilder.new.create_version_with_hierarchy "other_pacticipant", version_number
18
+ ProviderStateBuilder.new.create_version_with_hierarchy pacticipant_name, version_number
19
+ end
20
+
21
+ it "returns the version" do
22
+ expect(subject.number).to eq version_number
23
+ expect(subject.pacticipant.name).to eq pacticipant_name
24
+ end
25
+ end
26
+
27
+ context "when the version doesn't exist" do
28
+ it "returns nil" do
29
+ expect(subject).to be_nil
30
+ end
31
+ end
32
+
33
+ end
34
+
35
+
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+ require 'pact_broker/services/tag_service'
3
+
4
+ module PactBroker
5
+ module Services
6
+ describe TagService do
7
+
8
+ describe ".create" do
9
+
10
+ let(:pacticipant_name) { "test_pacticipant" }
11
+ let(:version_number) { "1.2.3" }
12
+ let(:tag_name) { "prod" }
13
+
14
+ let(:options) { {pacticipant_name: pacticipant_name, pacticipant_version_number: version_number, tag_name: tag_name}}
15
+ let(:provider_state_builder) { ProviderStateBuilder.new }
16
+
17
+ subject { TagService.create(options) }
18
+
19
+ # Naughty integration test... didn't seem much point unit testing this
20
+
21
+ it "creates the new tag" do
22
+ expect(subject.name).to eq tag_name
23
+ expect(subject.version.number).to eq version_number
24
+ expect(subject.version.pacticipant.name).to eq pacticipant_name
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -10,6 +10,7 @@ require 'pact_broker/api/resources/pact'
10
10
 
11
11
  Pact.configure do | config |
12
12
  config.logger.level = Logger::DEBUG
13
+ #config.diff_format = :plus_and_minus
13
14
  end
14
15
 
15
16
  Pact.service_provider "Pact Broker" do
@@ -54,6 +54,15 @@ Pact.provider_states_for "Pact Broker Client" do
54
54
  end
55
55
  end
56
56
 
57
+ provider_state "'Condor' exists in the pact-broker with version 1.3.0, tagged with 'prod'" do
58
+ set_up do
59
+ ProviderStateBuilder.new
60
+ .create_pacticipant("Condor")
61
+ .create_version('1.3.0')
62
+ .create_tag('prod')
63
+ end
64
+ end
65
+
57
66
  provider_state "'Condor' does not exist in the pact-broker" do
58
67
  no_op
59
68
  end
data/spec/spec_helper.rb CHANGED
@@ -4,7 +4,11 @@ RACK_ENV = 'test'
4
4
 
5
5
  $: << File.expand_path("../../", __FILE__)
6
6
 
7
+ require 'rack/test'
7
8
  require 'pact_broker/db'
9
+ require './spec/support/provider_state_builder'
10
+ require 'pact_broker/api'
11
+ require 'rspec/fire'
8
12
 
9
13
  RSpec.configure do | config |
10
14
  config.before :suite do
@@ -19,4 +23,10 @@ RSpec.configure do | config |
19
23
  DB::PACT_BROKER_DB[:pacticipants].truncate
20
24
  end
21
25
 
26
+ config.include Rack::Test::Methods
27
+ config.include RSpec::Fire
28
+
29
+ def app
30
+ PactBroker::API
31
+ end
22
32
  end
@@ -62,6 +62,31 @@ class ProviderStateBuilder
62
62
  PactBroker::Models::Pact.create(:consumer_version => version, :provider => provider)
63
63
  end
64
64
 
65
+ def create_version_with_hierarchy pacticipant_name, pacticipant_version
66
+ pacticipant = PactBroker::Models::Pacticipant.create(:name => pacticipant_name)
67
+ PactBroker::Models::Version.create(:number => pacticipant_version, :pacticipant => pacticipant)
68
+ end
69
+
70
+ def create_tag_with_hierarchy pacticipant_name, pacticipant_version, tag_name
71
+ version = create_version_with_hierarchy pacticipant_name, pacticipant_version
72
+ PactBroker::Models::Tag.create(name: tag_name, version: version)
73
+ end
74
+
75
+ def create_pacticipant pacticipant_name
76
+ @pacticipant = PactBroker::Models::Pacticipant.create(:name => pacticipant_name)
77
+ self
78
+ end
79
+
80
+ def create_version version_number
81
+ @version = PactBroker::Models::Version.create(:number => version_number, :pacticipant => @pacticipant)
82
+ self
83
+ end
84
+
85
+ def create_tag tag_name
86
+ @tag = PactBroker::Models::Tag.create(name: tag_name, version: @version)
87
+ self
88
+ end
89
+
65
90
  private
66
91
 
67
92
  # def create_pacticipant name
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact_broker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2014-02-27 00:00:00.000000000 Z
14
+ date: 2014-03-24 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: httparty
@@ -258,17 +258,17 @@ dependencies:
258
258
  requirement: !ruby/object:Gem::Requirement
259
259
  none: false
260
260
  requirements:
261
- - - ! '>='
261
+ - - '='
262
262
  - !ruby/object:Gem::Version
263
- version: '0'
263
+ version: 1.1.0.rc1
264
264
  type: :development
265
265
  prerelease: false
266
266
  version_requirements: !ruby/object:Gem::Requirement
267
267
  none: false
268
268
  requirements:
269
- - - ! '>='
269
+ - - '='
270
270
  - !ruby/object:Gem::Version
271
- version: '0'
271
+ version: 1.1.0.rc1
272
272
  description: A server that stores and returns pact files generated by the pact gem.
273
273
  It enables head/prod cross testing of the consumer and provider projects.
274
274
  email:
@@ -299,14 +299,16 @@ files:
299
299
  - lib/pact_broker/api.rb
300
300
  - lib/pact_broker/api/decorators.rb
301
301
  - lib/pact_broker/api/decorators/base_decorator.rb
302
- - lib/pact_broker/api/decorators/pact_broker_urls.rb
302
+ - lib/pact_broker/api/decorators/latest_pact_decorator.rb
303
303
  - lib/pact_broker/api/decorators/pact_collection_decorator.rb
304
304
  - lib/pact_broker/api/decorators/pact_decorator.rb
305
305
  - lib/pact_broker/api/decorators/pact_pacticipant_decorator.rb
306
306
  - lib/pact_broker/api/decorators/pacticipant_collection_decorator.rb
307
307
  - lib/pact_broker/api/decorators/pacticipant_decorator.rb
308
308
  - lib/pact_broker/api/decorators/representable_pact.rb
309
+ - lib/pact_broker/api/decorators/tag_decorator.rb
309
310
  - lib/pact_broker/api/decorators/version_decorator.rb
311
+ - lib/pact_broker/api/pact_broker_urls.rb
310
312
  - lib/pact_broker/api/resources/base_resource.rb
311
313
  - lib/pact_broker/api/resources/index.rb
312
314
  - lib/pact_broker/api/resources/latest_pact.rb
@@ -314,6 +316,7 @@ files:
314
316
  - lib/pact_broker/api/resources/pact.rb
315
317
  - lib/pact_broker/api/resources/pacticipant.rb
316
318
  - lib/pact_broker/api/resources/pacticipants.rb
319
+ - lib/pact_broker/api/resources/tag.rb
317
320
  - lib/pact_broker/db.rb
318
321
  - lib/pact_broker/logging.rb
319
322
  - lib/pact_broker/models.rb
@@ -325,10 +328,12 @@ files:
325
328
  - lib/pact_broker/repositories.rb
326
329
  - lib/pact_broker/repositories/pact_repository.rb
327
330
  - lib/pact_broker/repositories/pacticipant_repository.rb
331
+ - lib/pact_broker/repositories/tag_repository.rb
328
332
  - lib/pact_broker/repositories/version_repository.rb
329
333
  - lib/pact_broker/services.rb
330
334
  - lib/pact_broker/services/pact_service.rb
331
335
  - lib/pact_broker/services/pacticipant_service.rb
336
+ - lib/pact_broker/services/tag_service.rb
332
337
  - lib/pact_broker/services/version_service.rb
333
338
  - lib/pact_broker/tasks.rb
334
339
  - lib/pact_broker/tasks/migration_task.rb
@@ -337,8 +342,12 @@ files:
337
342
  - pact_broker_client-pact_broker.json
338
343
  - spec/lib/pact_broker/api/decorators/pact_collection_decorator_spec.rb
339
344
  - spec/lib/pact_broker/api/decorators/representable_pact_spec.rb
345
+ - spec/lib/pact_broker/api/resources/tag_spec.rb
340
346
  - spec/lib/pact_broker/models/order_versions_spec.rb
341
347
  - spec/lib/pact_broker/repositories/pact_repository_spec.rb
348
+ - spec/lib/pact_broker/repositories/tag_repository_spec.rb
349
+ - spec/lib/pact_broker/repositories/version_repository_spec.rb
350
+ - spec/lib/pact_broker/services/tag_service_spec.rb
342
351
  - spec/service_consumers/pact_helper.rb
343
352
  - spec/service_consumers/provider_states_for_pact_broker_client.rb
344
353
  - spec/spec_helper.rb
@@ -361,7 +370,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
361
370
  version: '0'
362
371
  segments:
363
372
  - 0
364
- hash: 615091496951534936
373
+ hash: -449205238157124147
365
374
  required_rubygems_version: !ruby/object:Gem::Requirement
366
375
  none: false
367
376
  requirements:
@@ -370,7 +379,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
370
379
  version: '0'
371
380
  segments:
372
381
  - 0
373
- hash: 615091496951534936
382
+ hash: -449205238157124147
374
383
  requirements: []
375
384
  rubyforge_project:
376
385
  rubygems_version: 1.8.23
@@ -380,8 +389,12 @@ summary: See description
380
389
  test_files:
381
390
  - spec/lib/pact_broker/api/decorators/pact_collection_decorator_spec.rb
382
391
  - spec/lib/pact_broker/api/decorators/representable_pact_spec.rb
392
+ - spec/lib/pact_broker/api/resources/tag_spec.rb
383
393
  - spec/lib/pact_broker/models/order_versions_spec.rb
384
394
  - spec/lib/pact_broker/repositories/pact_repository_spec.rb
395
+ - spec/lib/pact_broker/repositories/tag_repository_spec.rb
396
+ - spec/lib/pact_broker/repositories/version_repository_spec.rb
397
+ - spec/lib/pact_broker/services/tag_service_spec.rb
385
398
  - spec/service_consumers/pact_helper.rb
386
399
  - spec/service_consumers/provider_states_for_pact_broker_client.rb
387
400
  - spec/spec_helper.rb