prism_checker 0.0.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fdbe6028d9c35cc6c28a0bfac8c640604cb48cb240ac798255b87c4e957433e7
4
- data.tar.gz: 3af8ec42000e92c289da4e9f93fb60e026873b5ecbac3886625ede614df0d629
3
+ metadata.gz: 708e7858706b3dec7fcdd0afb12ffc69eec006e437c9bedbd510352dc7658b78
4
+ data.tar.gz: d89e926e401368026a7c352277362f24a409d499e34e24cdfecd528cc28ae321
5
5
  SHA512:
6
- metadata.gz: 787f9a963511e4990a90ddf082a1fdb21a6671c3d81171e0f5a959e46fd14d6b8750c62b65f59c7c0d92b10fc468e0cec1b7c5daba655157da9803719a9fa7d1
7
- data.tar.gz: ec334320865fd4b8a139b3982fe353523a3c627b87bd9d4a9be286b29ecb5048f2ea89b8198c2a4e23db082f70c80d0b6d7ade510cd7577bde60cee69655bdec
6
+ metadata.gz: c6694745c00973b6322191ec17e5ca6eb60d3b96a131053772873e8734537094b90b2062bf0e03aa6c0ae3b0c643fb8742f67668ca6b8204f4ec75f4a539b4cf
7
+ data.tar.gz: 555b76320684d68546ae2cba93920046c2de58083a69c17d67d9e8532558d561dd9d50b964556628cc7b18780d4b45d9a22646b73a9660d3a8852ef78eaf1917
data/README.md CHANGED
@@ -4,14 +4,15 @@
4
4
 
5
5
  ## Overview
6
6
 
7
- Prism checker - short and easy-to-read browser tests with clear error messages.
8
- Prism checker - extensions for rspec and minitest, built on top of the site_prism gem and uses its Page Object Model.
7
+ PrismChecker is an extension for rspec and minitest, built on top of the [SitePrism](https://github.com/site-prism/site_prism)
8
+ gem and using its page object model.
9
+ It allows you to write short, easy-to-read browser tests with clear error messages
9
10
 
10
- For example, we need to test the online shop cart:
11
+ Let's assume your application has the following shop cart:
11
12
 
12
13
  ![Cart](doc/images/cart.png "Cart")
13
14
 
14
- Corresponding SitePrism Page Object Model:
15
+ Corresponding SitePrism PDO::
15
16
 
16
17
  ```ruby
17
18
  class Cart < SitePrism::Page
@@ -107,9 +108,6 @@ In case of errors, an easy-to-read message will be displayed:
107
108
 
108
109
  ![Result](doc/images/result.png "Result")
109
110
 
110
- **Note.**
111
- _All examples are for rsepc, for mintest it will be the same, but instead of expect(page).be_like(expectation) it will be assert_page_like(page, expectation)_
112
-
113
111
  ## Install
114
112
  To install PrismChecker:
115
113
 
@@ -148,7 +146,7 @@ end
148
146
  ```
149
147
 
150
148
 
151
- #### Check text on the page
149
+ #### Text check
152
150
 
153
151
  ```ruby
154
152
  @page = Cart.new
@@ -158,11 +156,11 @@ expect(page).to be_like('Shopping Cart')
158
156
 
159
157
  # Same as
160
158
  # expect(page.loaded?).to eq(true)
161
- # expect(page).to match('Shopping Cart')
159
+ # expect(page.text).to match('Shopping Cart')
162
160
  ```
163
161
 
164
162
 
165
- #### Check element and section
163
+ #### Element and section check
166
164
 
167
165
  ```ruby
168
166
  @page = Cart.new
@@ -188,7 +186,7 @@ expect(page).to be_like(
188
186
  ```
189
187
 
190
188
 
191
- #### Check element
189
+ #### Element check
192
190
 
193
191
  ```ruby
194
192
  @page = Cart.new
@@ -217,7 +215,7 @@ expect(page).to be_like(header: 'Shopping Cart')
217
215
  ```
218
216
 
219
217
 
220
- #### Check section
218
+ #### Section check
221
219
 
222
220
  ```ruby
223
221
  expect(page.checkout).to be_like(
@@ -250,7 +248,7 @@ expect(page).to be_like(
250
248
  ```
251
249
 
252
250
 
253
- #### Check sections
251
+ #### Sections check
254
252
 
255
253
  ```ruby
256
254
  expect(page).to be_like(
@@ -305,7 +303,7 @@ expect(page).to be_like(cart_items: [{name: 'Cup'}, {name: 'Cap'}]) # Ok
305
303
  ```
306
304
 
307
305
 
308
- #### Check elements
306
+ #### Elements check
309
307
 
310
308
  ```ruby
311
309
  expect(page).to be_like(
@@ -660,7 +658,6 @@ When the comparison method is :inclusion, and it is necessary to compare with an
660
658
  expect(page.element_without_text).to be_like(:empty)
661
659
 
662
660
  # Same as
663
- # expect(page.element_without_text.visible?).to eq(true)
664
661
  # expect(page.element_without_text.text.empty?).to eq(true)
665
662
  ```
666
663
  or
@@ -17,45 +17,44 @@ require_relative 'node/bad_expectation'
17
17
 
18
18
  module PrismChecker
19
19
  class CheckDispatcher
20
- @check_map = {
20
+ COMMON_ELEMENT_CHECKERS = {
21
+ string: [ItemChecker::Element::Visible, ItemChecker::Element::String],
22
+ empty: [ItemChecker::Element::Empty],
23
+ regexp: [ItemChecker::Element::Visible, ItemChecker::Element::Regexp],
24
+ hash: [ItemChecker::Element::Visible],
25
+ visible: [ItemChecker::Element::Visible],
26
+ invisible: [ItemChecker::Element::Invisible]
27
+ }.freeze
28
+
29
+ COMMON_ELEMENTS_CHECKERS = {
30
+ string: [ItemChecker::Elements::String],
31
+ empty: [ItemChecker::Elements::Empty],
32
+ regexp: [ItemChecker::Elements::Regexp],
33
+ array: [ItemChecker::Elements::Array],
34
+ number: [ItemChecker::Elements::Number]
35
+ }.freeze
36
+
37
+ COMMON_INPUT_CHECKERS = {
38
+ string: [ItemChecker::Element::Visible, ItemChecker::Input::String],
39
+ empty: [ItemChecker::Element::Visible, ItemChecker::Input::Empty],
40
+ regexp: [ItemChecker::Element::Visible, ItemChecker::Input::Regexp],
41
+ hash: [ItemChecker::Element::Visible],
42
+ visible: [ItemChecker::Element::Visible],
43
+ invisible: [ItemChecker::Element::Invisible]
44
+ }.freeze
45
+
46
+ CHECK_MAP = {
21
47
  page: {
22
48
  string: [ItemChecker::Page::Loaded, ItemChecker::Page::String],
23
49
  regexp: [ItemChecker::Page::Loaded, ItemChecker::Page::Regexp],
24
50
  hash: [ItemChecker::Page::Loaded]
25
51
  },
26
52
 
27
- section: {
28
- string: [ItemChecker::Element::Visible, ItemChecker::Element::String],
29
- empty: [ItemChecker::Element::Visible, ItemChecker::Element::Empty],
30
- regexp: [ItemChecker::Element::Visible, ItemChecker::Element::Regexp],
31
- hash: [ItemChecker::Element::Visible],
32
- visible: [ItemChecker::Element::Visible],
33
- invisible: [ItemChecker::Element::Invisible]
34
- },
53
+ section: COMMON_ELEMENT_CHECKERS,
54
+ element: COMMON_ELEMENT_CHECKERS,
35
55
 
36
- sections: {
37
- string: [ItemChecker::Elements::String],
38
- regexp: [ItemChecker::Elements::Regexp],
39
- array: [ItemChecker::Elements::Array],
40
- number: [ItemChecker::Elements::Number]
41
- },
42
-
43
- element: {
44
- string: [ItemChecker::Element::Visible, ItemChecker::Element::String],
45
- empty: [ItemChecker::Element::Visible, ItemChecker::Element::Empty],
46
- regexp: [ItemChecker::Element::Visible, ItemChecker::Element::Regexp],
47
- hash: [ItemChecker::Element::Visible],
48
- visible: [ItemChecker::Element::Visible],
49
- invisible: [ItemChecker::Element::Invisible]
50
- },
51
-
52
- elements: {
53
- string: [ItemChecker::Elements::String],
54
- empty: [ItemChecker::Elements::Empty],
55
- regexp: [ItemChecker::Elements::Regexp],
56
- array: [ItemChecker::Elements::Array],
57
- number: [ItemChecker::Elements::Number]
58
- },
56
+ sections: COMMON_ELEMENTS_CHECKERS,
57
+ elements: COMMON_ELEMENTS_CHECKERS,
59
58
 
60
59
  image: {
61
60
  string: [ItemChecker::Element::Visible, ItemChecker::Image::String],
@@ -65,43 +64,20 @@ module PrismChecker
65
64
  invisible: [ItemChecker::Element::Invisible]
66
65
  },
67
66
 
68
- input: {
69
- string: [ItemChecker::Element::Visible, ItemChecker::Input::String],
70
- empty: [ItemChecker::Element::Visible, ItemChecker::Input::Empty],
71
- regexp: [ItemChecker::Element::Visible, ItemChecker::Input::Regexp],
72
- hash: [ItemChecker::Element::Visible],
73
- visible: [ItemChecker::Element::Visible],
74
- invisible: [ItemChecker::Element::Invisible]
75
- },
76
-
77
- textarea: {
78
- string: [ItemChecker::Element::Visible, ItemChecker::Textarea::String],
79
- empty: [ItemChecker::Element::Visible, ItemChecker::Textarea::Empty],
80
- regexp: [ItemChecker::Element::Visible, ItemChecker::Textarea::Regexp],
81
- hash: [ItemChecker::Element::Visible],
82
- visible: [ItemChecker::Element::Visible],
83
- invisible: [ItemChecker::Element::Invisible]
84
- },
67
+ input: COMMON_INPUT_CHECKERS,
68
+ textarea: COMMON_INPUT_CHECKERS,
69
+ select: COMMON_INPUT_CHECKERS,
85
70
 
86
- select: {
71
+ radio: {
87
72
  string: [ItemChecker::Element::Visible, ItemChecker::Input::String],
88
- empty: [ItemChecker::Element::Visible, ItemChecker::Input::Empty],
89
73
  regexp: [ItemChecker::Element::Visible, ItemChecker::Input::Regexp],
90
- hash: [ItemChecker::Element::Visible],
91
- visible: [ItemChecker::Element::Visible],
92
- invisible: [ItemChecker::Element::Invisible]
93
- },
94
-
95
- checkbox: {
96
74
  hash: [ItemChecker::Element::Visible],
97
75
  visible: [ItemChecker::Element::Visible],
98
76
  invisible: [ItemChecker::Element::Invisible],
99
77
  boolean: [ItemChecker::Element::Visible, ItemChecker::Checkbox::Boolean]
100
78
  },
101
79
 
102
- radio: {
103
- string: [ItemChecker::Element::Visible, ItemChecker::Input::String],
104
- regexp: [ItemChecker::Element::Visible, ItemChecker::Input::Regexp],
80
+ checkbox: {
105
81
  hash: [ItemChecker::Element::Visible],
106
82
  visible: [ItemChecker::Element::Visible],
107
83
  invisible: [ItemChecker::Element::Invisible],
@@ -109,8 +85,9 @@ module PrismChecker
109
85
  },
110
86
 
111
87
  array: {
88
+ array: [ItemChecker::Array::Array],
112
89
  string: [ItemChecker::Array::String],
113
- empty: [ItemChecker::Array::String],
90
+ empty: [ItemChecker::Array::Empty],
114
91
  regexp: [ItemChecker::Array::Regexp],
115
92
  number: [ItemChecker::Elements::Number]
116
93
  },
@@ -119,8 +96,9 @@ module PrismChecker
119
96
  boolean: [ItemChecker::Any::Any]
120
97
  },
121
98
 
122
- number: {
123
- number: [ItemChecker::Any::Any]
99
+ other: {
100
+ number: [ItemChecker::Any::Any],
101
+ other: [ItemChecker::Any::Any]
124
102
  },
125
103
 
126
104
  string: {
@@ -133,12 +111,12 @@ module PrismChecker
133
111
  string: [ItemChecker::Nil::String],
134
112
  regexp: [ItemChecker::Nil::Regexp]
135
113
  }
136
- }
114
+ }.freeze
137
115
 
138
116
  def self.checkers(_node, element, expectation, item_type)
139
117
  expectation_type = ExpectationClassifier.classify(expectation)
140
118
 
141
- element_expectations = @check_map[item_type]
119
+ element_expectations = CHECK_MAP[item_type]
142
120
 
143
121
  raise_bad_element(element) unless element_expectations
144
122
 
@@ -159,10 +137,5 @@ module PrismChecker
159
137
  error = "Don't know how to compare #{element_class} with #{expectation.class.name}"
160
138
  raise Node::BadExpectation, error
161
139
  end
162
-
163
- def self.add(element_type, check_type, checks)
164
- @check_map[element_type] ||= {}
165
- @check_map[element_type][check_type] = checks
166
- end
167
140
  end
168
141
  end
@@ -19,24 +19,18 @@ module PrismChecker
19
19
  def check(item, expectation)
20
20
  prepare(item, expectation)
21
21
 
22
+ # rubocop:disable Style/SymbolProc
23
+ # rubocop is wrong
22
24
  walk_through do |node|
23
25
  node.check
24
26
  end
27
+ # rubocop:enable Style/SymbolProc
25
28
 
26
29
  @result = true
27
30
  rescue Node::CheckFail
28
- # puts report
29
31
  @result = false
30
- # rescue Node::BadExpectation => e
31
- # # raise
32
- # raise e.class, report + "\n" + e.message
33
32
  rescue StandardError => e
34
- # puts '---------------------'
35
- # puts e.class
36
- # puts e.message
37
- # pp e.backtrace
38
- # puts '---------------------'
39
- raise e.class, report + "\n" + e.message
33
+ raise e.class, "#{report}\n#{e.message}"
40
34
  end
41
35
 
42
36
  def report
@@ -37,15 +37,9 @@ module PrismChecker
37
37
  return @element.send(method, *args)
38
38
  end
39
39
 
40
- # if (ItemClassifier.element_checkbox?(@element) || ItemClassifier.element_radio?(@element)) && method == :checked
41
- # return @element.checked?
42
- # end
43
-
44
40
  ret = @element[method]
45
41
 
46
42
  if ret.nil? && !method.start_with?('data-')
47
- # return '' if method.start_with?('data-')
48
-
49
43
  raise NoMethodError, "unknown attribute '#{method}'"
50
44
  end
51
45
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  module PrismChecker
4
4
  class ExpectationClassifier
5
- @expectations_map = [
5
+ EXPECTATIONS_MAP = [
6
6
  %i[invisible invisible?],
7
7
  %i[visible visible?],
8
8
  %i[empty empty?],
@@ -12,16 +12,12 @@ module PrismChecker
12
12
  %i[hash hash?],
13
13
  %i[boolean boolean?],
14
14
  %i[number number?]
15
- ]
15
+ ].freeze
16
16
 
17
17
  def self.classify(expectation)
18
- @expectations_map.each do |data|
18
+ EXPECTATIONS_MAP.each do |data|
19
19
  type, probe = data
20
- if probe.is_a? Symbol
21
- return type if send(probe, expectation)
22
- elsif probe.call(expectation)
23
- return type
24
- end
20
+ return type if send(probe, expectation)
25
21
  end
26
22
 
27
23
  :other
@@ -62,9 +58,5 @@ module PrismChecker
62
58
  def self.number?(expectation)
63
59
  expectation.is_a?(Integer)
64
60
  end
65
-
66
- def self.add(type, probe, position = 0)
67
- @expectations_map.insert(position, [type, probe])
68
- end
69
61
  end
70
62
  end
@@ -3,11 +3,20 @@
3
3
  require_relative 'item_check/string'
4
4
  require_relative 'item_check/regexp'
5
5
  require_relative 'item_check/empty_array'
6
+ require_relative 'item_check/array'
6
7
  require_relative 'item_value/array'
7
8
 
8
9
  module PrismChecker
9
10
  module ItemChecker
10
11
  module Array
12
+ class Array
13
+ def self.value(elements)
14
+ elements
15
+ end
16
+
17
+ extend ItemCheck::Array
18
+ end
19
+
11
20
  class String
12
21
  extend ItemValue::Array
13
22
  extend ItemCheck::String
@@ -16,7 +16,7 @@ module PrismChecker
16
16
  value == expectation
17
17
  end
18
18
 
19
- def self.error_message(_checkbox, value, expectation)
19
+ def self.error_message(_checkbox, _value, expectation)
20
20
  if expectation
21
21
  'Expected to be checked'
22
22
  else
@@ -8,7 +8,6 @@ require_relative 'item_check/empty'
8
8
  module PrismChecker
9
9
  module ItemChecker
10
10
  module Element
11
-
12
11
  class String
13
12
  extend ItemValue::Element
14
13
  extend ItemCheck::String
@@ -25,7 +24,9 @@ module PrismChecker
25
24
  end
26
25
 
27
26
  class Visible
28
- def self.value(_element); end
27
+ def self.value(element)
28
+ element
29
+ end
29
30
 
30
31
  def self.check(element, _value, _expectation)
31
32
  element.visible?
@@ -43,10 +43,12 @@ module PrismChecker
43
43
 
44
44
  class Empty
45
45
  def self.value(elements)
46
- elements
46
+ elements.map(&:text).join
47
47
  end
48
48
 
49
- extend ItemCheck::EmptyArray
49
+ def self.check(_elements, value, _expectation)
50
+ value.empty?
51
+ end
50
52
  end
51
53
  end
52
54
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PrismChecker
4
+ module ItemChecker
5
+ module ItemCheck
6
+ module Array
7
+ def check(_element, value, expectation)
8
+ value.size == expectation.size
9
+ end
10
+
11
+ def error_message(elements, _value, expectation)
12
+ "Wrong elements count\nActual: #{elements.size}\nExpected: #{expectation.size}"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -5,7 +5,7 @@ require 'capybara'
5
5
 
6
6
  module PrismChecker
7
7
  class ItemClassifier
8
- @elements_map = [
8
+ ELEMENTS_MAP = [
9
9
  %i[checkbox element_checkbox?],
10
10
  %i[radio element_radio?],
11
11
  %i[input element_input?],
@@ -21,16 +21,12 @@ module PrismChecker
21
21
  %i[string string?],
22
22
  %i[boolean boolean?],
23
23
  %i[nil element_nil?]
24
- ]
24
+ ].freeze
25
25
 
26
26
  def self.classify(element)
27
- @elements_map.each do |data|
27
+ ELEMENTS_MAP.each do |data|
28
28
  type, probe = data
29
- if probe.is_a? Symbol
30
- return type if send(probe, element)
31
- elsif probe.call(element)
32
- return type
33
- end
29
+ return type if send(probe, element)
34
30
  end
35
31
 
36
32
  :other
@@ -120,9 +116,5 @@ module PrismChecker
120
116
  def self.element_nil?(element)
121
117
  element.nil?
122
118
  end
123
-
124
- def self.add(type, probe, position = 0)
125
- @elements_map.insert(position, [type, probe])
126
- end
127
119
  end
128
120
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prism_checker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ganglion-17
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-03 00:00:00.000000000 Z
11
+ date: 2024-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: site_prism
@@ -16,16 +16,30 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 3.0.0
19
+ version: '3.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 3.0.0
26
+ version: '3.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: byebug
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '11.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '11.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: dotenv
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - ">="
@@ -44,14 +58,14 @@ dependencies:
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '3.10'
61
+ version: '3.1'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '3.10'
68
+ version: '3.1'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rubocop
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -156,36 +170,8 @@ dependencies:
156
170
  - - "~>"
157
171
  - !ruby/object:Gem::Version
158
172
  version: '4.6'
159
- - !ruby/object:Gem::Dependency
160
- name: ruby-prof
161
- requirement: !ruby/object:Gem::Requirement
162
- requirements:
163
- - - ">="
164
- - !ruby/object:Gem::Version
165
- version: '0'
166
- type: :development
167
- prerelease: false
168
- version_requirements: !ruby/object:Gem::Requirement
169
- requirements:
170
- - - ">="
171
- - !ruby/object:Gem::Version
172
- version: '0'
173
- - !ruby/object:Gem::Dependency
174
- name: dotenv
175
- requirement: !ruby/object:Gem::Requirement
176
- requirements:
177
- - - ">="
178
- - !ruby/object:Gem::Version
179
- version: '0'
180
- type: :development
181
- prerelease: false
182
- version_requirements: !ruby/object:Gem::Requirement
183
- requirements:
184
- - - ">="
185
- - !ruby/object:Gem::Version
186
- version: '0'
187
173
  description: |
188
- Prism checker is an extension for rspec and minitest, built on top of the SitePrism gem and using its page object model.
174
+ prism_checker is an extension for rspec and minitest, built on top of the site_prism gem and using its page object model.
189
175
  It allows you to write short, easy-to-read browser tests with clear error messages
190
176
  email:
191
177
  - ganglion1717@gmail.com
@@ -210,6 +196,7 @@ files:
210
196
  - lib/prism_checker/item_checker/elements.rb
211
197
  - lib/prism_checker/item_checker/image.rb
212
198
  - lib/prism_checker/item_checker/input.rb
199
+ - lib/prism_checker/item_checker/item_check/array.rb
213
200
  - lib/prism_checker/item_checker/item_check/empty.rb
214
201
  - lib/prism_checker/item_checker/item_check/empty_array.rb
215
202
  - lib/prism_checker/item_checker/item_check/number.rb