webmock-twirp 0.1.2 → 0.2.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,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0264d26c4984559b4163ff5740fda0df43882736fa174881a63939c195e85331
4
- data.tar.gz: 9d0da633242e3f722d18c0c97042c5312b16ba4fb28fb6509479a04f5c4201eb
3
+ metadata.gz: 5a732c5a4926da1aa55cfb9348ea84c0cd7506fabc1e598a746dabd4fa57a2c9
4
+ data.tar.gz: e4ec2abe817732781453442877ffbae84771919cebed81238360c3a002ef7820
5
5
  SHA512:
6
- metadata.gz: 369e27e257599a09541feb244e9a4c1ff59a7b069c3df154c361c6567ce8f15f0e3b46cbfb0252ebe7c72beed20cb31bb8c947857d84372aec7ae3d697e21602
7
- data.tar.gz: 7aa1544321a07d5f8350203f16f331d2e9ee90b5b38928d29d1b4fb2750101109298796ff7b571684108af8aaf3c80d4b2d595a27cdef0b33715c888cb99f1cd
6
+ metadata.gz: 28e13a626132b193b2d3aaa26c5d192949d296171d63d2b5bc2539fd88eab2a72c633d29bc0a4711d804ba7be144de2dc57a1be8b1d71a5d0b614fa3c927885b
7
+ data.tar.gz: 7b42012c4c5ea5c49868091dddf44cdafcd4fcb7b76dadae2bd91135c8bb5b65307aca1797eef8153d9839fe72ddf08c0178156227f0c74b0fe561a03642d829
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ### v0.2.0 (2022-10-17)
2
+ - improved matching
3
+
1
4
  ### v0.1.2 (2022-10-17)
2
5
  - improved matching
3
6
  - test coverage
@@ -9,10 +9,66 @@ module WebMock
9
9
 
10
10
  refine Google::Protobuf::MessageExts do
11
11
  def normalized_hash(symbolize_keys: true)
12
- JSON.parse(
13
- to_json(preserve_proto_fieldnames: true),
14
- symbolize_names: symbolize_keys,
15
- )
12
+ res = {}
13
+
14
+ self.class.descriptor.each do |field|
15
+ key = symbolize_keys ? field.name.to_sym : field.name
16
+ value = field.get(self)
17
+
18
+ if value.is_a?(Google::Protobuf::MessageExts)
19
+ # recursively serialize sub-message
20
+ value = value.normalized_hash(symbolize_keys: symbolize_keys)
21
+ end
22
+
23
+ res[key] = value unless field.default == value
24
+ end
25
+
26
+ res
27
+ end
28
+
29
+ def include?(*args)
30
+ expected_attrs = Hash === args.last ? args.pop : {}
31
+
32
+ # ensure all enumerated keys are present
33
+ return false unless args.all? { |attr| respond_to?(attr) }
34
+
35
+ # ensure all enumerated attributes are present
36
+ return false unless expected_attrs.keys.all? { |attr| respond_to?(attr) }
37
+
38
+ # check expected attribute matches
39
+ expected_attrs.all? do |expected_attr, expected_value|
40
+ actual_value = send(expected_attr)
41
+
42
+ matches = expected_value === actual_value
43
+
44
+ if actual_value.is_a?(Google::Protobuf::MessageExts)
45
+ if expected_value.is_a?(Hash)
46
+ matches ||= actual_value.match?(**expected_value)
47
+ else
48
+ matches ||= expected_value === actual_value.to_h
49
+ # matches ||= expected_value === actual_value.normalized_hash
50
+ end
51
+ end
52
+
53
+ matches
54
+ end
55
+ end
56
+
57
+ def match?(**attrs)
58
+ # ensure all enumerated keys are present
59
+ return false unless attrs.keys.all? { |attr| respond_to?(attr) }
60
+
61
+ # ensure each field matches
62
+ self.class.descriptor.all? do |field|
63
+ actual_value = field.get(self)
64
+ expected_value = attrs[field.name.to_sym]
65
+
66
+ if actual_value.is_a?(Google::Protobuf::MessageExts) && expected_value.is_a?(Hash)
67
+ actual_value.match?(**expected_value)
68
+ else
69
+ attrs.fetch(field.name.to_sym, field.default) === actual_value
70
+ end
71
+ end
16
72
  end
17
73
  end
18
74
  end
@@ -71,27 +71,11 @@ module WebMock
71
71
 
72
72
  decoder = ->(request) do
73
73
  input_class = rpc_from_request(request)[:input_class]
74
-
75
- matched = true
76
74
  decoded_request = input_class.decode(request.body)
77
75
 
78
- if attrs.any?
79
- if defined?(RSpec::Matchers::BuiltIn::Include)
80
- matcher = RSpec::Matchers::BuiltIn::Include.new(attrs)
81
- attr_hash = decoded_request.to_h
82
- normalize = ->{ decoded_request.normalized_hash }
83
- else
84
- matcher = WebMock::Matchers::HashIncludingMatcher.new(attrs)
85
- attr_hash = WebMock::Util::HashKeysStringifier.stringify_keys!(decoded_request.to_h, deep: true)
86
- normalize = ->{ decoded_request.normalized_hash(symbolize_keys: false) }
87
- end
88
-
89
- matched &= (matcher === attr_hash || matcher === normalize.call)
90
- end
91
-
92
- if block
93
- matched &= block.call(decoded_request)
94
- end
76
+ matched = true
77
+ matched &= decoded_request.include?(attrs) if attrs.any?
78
+ matched &= block.call(decoded_request) if block
95
79
 
96
80
  matched
97
81
  end if attrs.any? || block_given?
@@ -1,5 +1,5 @@
1
1
  module WebMock
2
2
  module Twirp
3
- VERSION = "0.1.2"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webmock-twirp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Pepper
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-17 00:00:00.000000000 Z
11
+ date: 2022-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: webmock