prism_checker 0.0.3 → 1.0.1

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: fdbe6028d9c35cc6c28a0bfac8c640604cb48cb240ac798255b87c4e957433e7
4
- data.tar.gz: 3af8ec42000e92c289da4e9f93fb60e026873b5ecbac3886625ede614df0d629
3
+ metadata.gz: 85257e035e4a88514ae52cc74f626c3773b28a3e79af092dfe28655285af022f
4
+ data.tar.gz: cf8a7167976cda2f9c20dfcefce982da0a95b664d1c459483275701583ecf01b
5
5
  SHA512:
6
- metadata.gz: 787f9a963511e4990a90ddf082a1fdb21a6671c3d81171e0f5a959e46fd14d6b8750c62b65f59c7c0d92b10fc468e0cec1b7c5daba655157da9803719a9fa7d1
7
- data.tar.gz: ec334320865fd4b8a139b3982fe353523a3c627b87bd9d4a9be286b29ecb5048f2ea89b8198c2a4e23db082f70c80d0b6d7ade510cd7577bde60cee69655bdec
6
+ metadata.gz: 20f7f466e32972c19d7b828cae40de07c8d2f6462aac78bb891e744d89109cfefae86a71b06ded90a47f803267053bcd7c62c095bf7e86aad57b916b53f96a99
7
+ data.tar.gz: 4fbcb5350cc2bcde2a8877757c4afdc4b17fb367da82e3ee95e68c00c1de5b7b3e4b324919792a87ee20fa60bb99b24a71392a45cb2db9ac994e5337076e5cc2
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
@@ -122,7 +122,7 @@ module PrismChecker
122
122
  value = nil
123
123
  checkers.each do |checker|
124
124
  result = wait_until_true do
125
- element = self.element if element.is_a? ::Array
125
+ element = self.element if element.is_a?(::Array) || element.is_a?(Capybara::Result)
126
126
 
127
127
  value = checker.value(element)
128
128
  checker.check(element, value, expectation)
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.1
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-12-14 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