watir_api 0.2.0 → 0.2.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 +4 -4
- data/README.md +137 -5
- data/lib/watir_api.rb +7 -4
- data/watir_api.gemspec +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5774f09a5ef7ee12f3a8726d05ddb0dd1da0ef6
|
4
|
+
data.tar.gz: 10f86cada217f8547693b7d5a257a02e74036ebb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a85d99f5328327fbd77d0e671d9524d6fc7fa04066d994674aa2cb6b6b7e7a8e7888203f5607f8484a65a744d36fb2c4931371464f0b7d6663f845b7f969fb16
|
7
|
+
data.tar.gz: 6e2ca0725ac604af8b222b49ec835eaeba33bb5607d85c16f0e679103ce47acc53e68d60f001542ee12d194db38a93928042b250c065a6abd44713d88d741a1e
|
data/README.md
CHANGED
@@ -1,7 +1,13 @@
|
|
1
|
-
#
|
1
|
+
# Watir API
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
As more web applications make use of an interface to interact with their service layer, people now have
|
4
|
+
more flexibility to set up and verify parts of their UI tests without needing to use a browser.
|
5
|
+
|
6
|
+
This simple gem makes it easy to subclass `WatirApi::Base` and provide all of the information necessary
|
7
|
+
to interact with the different REST endpoints available in your application.
|
8
|
+
|
9
|
+
This code is designed to be used with the [watir_model gem](https://github.com/titusfortner/watir_model). The Model stores the canonical data and is used
|
10
|
+
to make it easy to compare the input and output from both the API and the UI.
|
5
11
|
|
6
12
|
## Installation
|
7
13
|
|
@@ -21,8 +27,134 @@ Or install it yourself as:
|
|
21
27
|
|
22
28
|
## Usage
|
23
29
|
|
24
|
-
|
25
|
-
|
30
|
+
1. Set the base url
|
31
|
+
```ruby
|
32
|
+
WatirApi::Base.base_url = '"https://restful-booker.herokuapp.com"'
|
33
|
+
```
|
34
|
+
2. Create a subclass with an endpoint:
|
35
|
+
```ruby
|
36
|
+
module API
|
37
|
+
class Booking < WatirApi::Base
|
38
|
+
def self.endpoint
|
39
|
+
'booking'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
```
|
44
|
+
|
45
|
+
3. Make API calls
|
46
|
+
```ruby
|
47
|
+
booking = {firstname: "Trey",
|
48
|
+
lastname: "Ruecker",
|
49
|
+
totalprice: 83,
|
50
|
+
depositpaid: true,
|
51
|
+
bookingdates: {checkin: '2019-02-23',
|
52
|
+
checkout: '2019-02-27'}}
|
53
|
+
|
54
|
+
API::Booking.create(booking)
|
55
|
+
```
|
56
|
+
|
57
|
+
4. The Array or Hash of results is accessed with `#data`
|
58
|
+
```ruby
|
59
|
+
booking = {firstname: "David",
|
60
|
+
lastname: "Jones",
|
61
|
+
totalprice: 183,
|
62
|
+
depositpaid: true,
|
63
|
+
bookingdates: {checkin: '2019-03-23',
|
64
|
+
checkout: '2019-03-27'}}
|
65
|
+
|
66
|
+
created_booking = API::Booking.create(booking)
|
67
|
+
booking_id = created_booking.data[:bookingid]
|
68
|
+
|
69
|
+
stored_booking = API::Booking.show(id: booking_id).data
|
70
|
+
|
71
|
+
expect(stored_booking).to eq booking
|
72
|
+
```
|
73
|
+
|
74
|
+
5. Use [Watir Model](https://github.com/titusfortner/watir_model)
|
75
|
+
|
76
|
+
Note that the code in the previous example will actually fail.
|
77
|
+
This is because we are storing dates as `String` values and the input `String`
|
78
|
+
does not match the output `String`
|
79
|
+
|
80
|
+
Hashes are hard to compare, which is why we have `WatirModel`.
|
81
|
+
WatirModel is designed to store the canonical representation of related data in the appropriate data type,
|
82
|
+
specifically so that data can be correctly compared.
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
module Model
|
86
|
+
class BookingDates < WatirModel
|
87
|
+
key(:checkin, data_type: Date) { Faker::Date.forward }
|
88
|
+
key(:checkout, data_type: Date) { checkin + 4 }
|
89
|
+
end
|
90
|
+
|
91
|
+
class Booking < WatirModel
|
92
|
+
key(:firstname) { Faker::Name.first_name }
|
93
|
+
key(:lastname) { Faker::Name.last_name }
|
94
|
+
key(:totalprice, data_type: Integer) { Faker::Commerce.price.round }
|
95
|
+
key(:depositpaid) { true }
|
96
|
+
key(:bookingdates, data_type: BookingDates) { BookingDates.new }
|
97
|
+
key(:additionalneeds)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
```
|
101
|
+
|
102
|
+
Because we have a model class defined that is named the same as the API class, `WatirApi` will
|
103
|
+
automatically attempt to create an instance of the model from the return value of the API call.
|
104
|
+
It is accessible from a method based on the name of the API/Model classes, so in this case `#booking`:
|
105
|
+
|
106
|
+
```ruby
|
107
|
+
booking = Model::Booking.new
|
108
|
+
|
109
|
+
created_booking = API::Booking.create(booking)
|
110
|
+
booking_id = created_booking.data[:bookingid]
|
111
|
+
|
112
|
+
stored_booking = API::Booking.show(id: booking_id).booking
|
113
|
+
|
114
|
+
expect(stored_booking).to eq booking
|
115
|
+
```
|
116
|
+
|
117
|
+
6. Customize
|
118
|
+
|
119
|
+
You have a subclass, so if you need to add or change things before or after a call, just override the `WatirApi` method
|
120
|
+
in your subclass:
|
121
|
+
|
122
|
+
```ruby
|
123
|
+
module API
|
124
|
+
class Booking < WatirApi::Base
|
125
|
+
|
126
|
+
attr_reader :id
|
127
|
+
|
128
|
+
def initialize(*)
|
129
|
+
super
|
130
|
+
return if @data.is_a?(Array)
|
131
|
+
@id = @data[:bookingid]
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
```
|
136
|
+
Now we can use this like so:
|
137
|
+
```ruby
|
138
|
+
booking = Model::Booking.new
|
139
|
+
|
140
|
+
created_booking = API::Booking.create(booking)
|
141
|
+
|
142
|
+
expect(created_booking.id).to eq created_booking.data[:bookingid]
|
143
|
+
```
|
144
|
+
|
145
|
+
Because this pattern comes in very handy, you can use `#define_attribute` to do the same thing:
|
146
|
+
|
147
|
+
```ruby
|
148
|
+
module API
|
149
|
+
class Booking < WatirApi::Base
|
150
|
+
def initialize(*)
|
151
|
+
super
|
152
|
+
return if @data.is_a?(Array)
|
153
|
+
define_attribute(:id, @data[:bookingid])
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
```
|
26
158
|
|
27
159
|
## Contributing
|
28
160
|
|
data/lib/watir_api.rb
CHANGED
@@ -98,10 +98,8 @@ module WatirApi
|
|
98
98
|
model = convert_to_model(@data) unless @data.nil?
|
99
99
|
var = model_object.to_s[/[^:]*$/].underscore
|
100
100
|
var = var.pluralize if @data.is_a? Array
|
101
|
-
|
102
|
-
|
103
|
-
@id = @data[:id] if @data.is_a? Hash
|
104
|
-
singleton_class.class_eval { attr_accessor :id } unless @id.nil?
|
101
|
+
define_attribute(var, model)
|
102
|
+
define_attribute(:id, @data[:id]) if @data.is_a? Hash
|
105
103
|
end
|
106
104
|
|
107
105
|
def convert_to_model(data)
|
@@ -123,5 +121,10 @@ module WatirApi
|
|
123
121
|
def model_object
|
124
122
|
self.class.model_object
|
125
123
|
end
|
124
|
+
|
125
|
+
def define_attribute(key, value)
|
126
|
+
instance_variable_set("@#{key}", value)
|
127
|
+
singleton_class.class_eval { attr_reader key }
|
128
|
+
end
|
126
129
|
end
|
127
130
|
end
|
data/watir_api.gemspec
CHANGED