anmo 0.0.14 → 0.0.15
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.
- data/README.md +32 -0
- data/features/api.feature +8 -0
- data/features/step_definitions/api_steps.rb +5 -1
- data/lib/anmo.rb +4 -0
- data/lib/anmo/application.rb +36 -29
- data/lib/anmo/version.rb +1 -1
- data/test/anmo/application_test.rb +6 -1
- metadata +23 -22
data/README.md
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
Anmo
|
2
|
+
====
|
3
|
+
|
4
|
+
What?
|
5
|
+
-----
|
6
|
+
Anmo acts as a mock api and can be used to store arbitrary pieces of data for integration testing flaky APIs.
|
7
|
+
This is generally *not a good idea*, but where you can't use [VCR](https://github.com/myronmarston/vcr) anmo is now an option.
|
8
|
+
|
9
|
+
How?
|
10
|
+
----
|
11
|
+
|
12
|
+
```
|
13
|
+
require "anmo"
|
14
|
+
|
15
|
+
Thread.new { Anmo.launch_server }
|
16
|
+
|
17
|
+
Anmo.create_request({
|
18
|
+
:path => "/lookatmyhorse",
|
19
|
+
:body => "my horse is amazing"
|
20
|
+
})
|
21
|
+
```
|
22
|
+
|
23
|
+
```
|
24
|
+
curl http://localhost:8787/lookatmyhorse
|
25
|
+
my horse is amazing
|
26
|
+
```
|
27
|
+
|
28
|
+
Multiple Hosts?
|
29
|
+
---------------
|
30
|
+
|
31
|
+
Yep. If you have one running anmo server then each domain that points to that server will have it's own data in anmo.
|
32
|
+
For example the hosts anmo2.example.org and anmo2.example.org can point at the same anmo instance, and each will have their own data.
|
data/features/api.feature
CHANGED
@@ -210,3 +210,11 @@ Feature: API
|
|
210
210
|
And I save an object to the host "http://sample.org"
|
211
211
|
When I request the object from the host "http://another.org"
|
212
212
|
Then I see the object saved to the host "http://another.org"
|
213
|
+
|
214
|
+
Scenario: Anmo knows what version the server is running
|
215
|
+
Given an anmo server
|
216
|
+
When I execute the code
|
217
|
+
"""
|
218
|
+
Anmo.server_version
|
219
|
+
"""
|
220
|
+
Then I see the anmo version
|
@@ -7,7 +7,7 @@ When /^I execute the following code in a new thread$/ do |code|
|
|
7
7
|
end
|
8
8
|
|
9
9
|
When /^I execute the code$/ do |code|
|
10
|
-
eval code
|
10
|
+
@result = eval code
|
11
11
|
end
|
12
12
|
|
13
13
|
Then /^I see an anmo server on port (\d+)$/ do |port|
|
@@ -111,3 +111,7 @@ Then /^I should see the request with the path "([^"]*)"$/ do |path|
|
|
111
111
|
@requests.size.should == 1
|
112
112
|
@requests.first["PATH_INFO"].should == path
|
113
113
|
end
|
114
|
+
|
115
|
+
Then /^I see the anmo version$/ do
|
116
|
+
@result.should == Anmo::VERSION
|
117
|
+
end
|
data/lib/anmo.rb
CHANGED
data/lib/anmo/application.rb
CHANGED
@@ -1,24 +1,18 @@
|
|
1
1
|
module Anmo
|
2
2
|
class ApplicationDataStore
|
3
3
|
class << self
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
def reset_stored_objects!
|
9
|
-
@stored_objects = {}
|
10
|
-
end
|
11
|
-
|
12
|
-
def stored_requests host
|
13
|
-
@stored_requests ||= {}
|
14
|
-
@stored_requests[host] ||= []
|
15
|
-
@stored_requests[host]
|
16
|
-
end
|
4
|
+
[:requests, :objects].each do |t|
|
5
|
+
define_method :"reset_#{t}!" do
|
6
|
+
instance_variable_set(:"@stored_#{t}", {})
|
7
|
+
end
|
17
8
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
9
|
+
define_method :"stored_#{t}" do |host|
|
10
|
+
name = :"@stored_#{t}"
|
11
|
+
instance_variable_set(name, {}) unless instance_variable_get(name)
|
12
|
+
values = instance_variable_get(name)
|
13
|
+
values[host] ||= []
|
14
|
+
values[host]
|
15
|
+
end
|
22
16
|
end
|
23
17
|
end
|
24
18
|
end
|
@@ -29,11 +23,12 @@ module Anmo
|
|
29
23
|
|
30
24
|
controller_methods = [
|
31
25
|
:alive,
|
26
|
+
:version,
|
32
27
|
:create_object,
|
33
|
-
:
|
28
|
+
:objects,
|
34
29
|
:requests,
|
35
|
-
:
|
36
|
-
:
|
30
|
+
:delete_all_objects,
|
31
|
+
:delete_all_requests
|
37
32
|
]
|
38
33
|
|
39
34
|
method = controller_methods.find {|m| request.path_info =~ /\/?__#{m.to_s.upcase}__\/?/}
|
@@ -43,6 +38,14 @@ module Anmo
|
|
43
38
|
|
44
39
|
private
|
45
40
|
|
41
|
+
def text text, status = 200
|
42
|
+
[status, {"Content-Type" => "text/html"}, [text]]
|
43
|
+
end
|
44
|
+
|
45
|
+
def json json, status = 200
|
46
|
+
[status, {"Content-Type" => "application/json"}, [json]]
|
47
|
+
end
|
48
|
+
|
46
49
|
def stored_requests request
|
47
50
|
ApplicationDataStore.stored_requests(request.host)
|
48
51
|
end
|
@@ -52,41 +55,45 @@ module Anmo
|
|
52
55
|
end
|
53
56
|
|
54
57
|
def alive request
|
55
|
-
|
58
|
+
text "<h1>anmo is alive</h1>"
|
59
|
+
end
|
60
|
+
|
61
|
+
def version request
|
62
|
+
text Anmo::VERSION
|
56
63
|
end
|
57
64
|
|
58
65
|
def create_object request
|
59
66
|
request_info = JSON.parse(read_request_body(request))
|
60
67
|
stored_objects(request).unshift(request_info)
|
61
|
-
|
68
|
+
text "", 201
|
62
69
|
end
|
63
70
|
|
64
71
|
def delete_all_objects request
|
65
|
-
ApplicationDataStore.
|
66
|
-
|
72
|
+
ApplicationDataStore.reset_objects!
|
73
|
+
text ""
|
67
74
|
end
|
68
75
|
|
69
76
|
def process_normal_request request
|
70
77
|
stored_requests(request) << request.env
|
71
78
|
|
72
79
|
if found_request = find_stored_request(request)
|
73
|
-
[Integer(found_request["status"]||200)
|
80
|
+
text found_request["body"], Integer(found_request["status"]||200)
|
74
81
|
else
|
75
|
-
|
82
|
+
text "Not Found", 404
|
76
83
|
end
|
77
84
|
end
|
78
85
|
|
79
86
|
def requests request
|
80
|
-
|
87
|
+
json stored_requests(request).to_json
|
81
88
|
end
|
82
89
|
|
83
90
|
def delete_all_requests request
|
84
91
|
ApplicationDataStore.reset_requests!
|
85
|
-
|
92
|
+
text ""
|
86
93
|
end
|
87
94
|
|
88
95
|
def objects request
|
89
|
-
|
96
|
+
json stored_objects(request).to_json
|
90
97
|
end
|
91
98
|
|
92
99
|
def find_stored_request actual_request
|
data/lib/anmo/version.rb
CHANGED
@@ -15,7 +15,7 @@ module Anmo
|
|
15
15
|
|
16
16
|
def setup
|
17
17
|
ApplicationDataStore.reset_requests!
|
18
|
-
ApplicationDataStore.
|
18
|
+
ApplicationDataStore.reset_objects!
|
19
19
|
end
|
20
20
|
|
21
21
|
def save_object path, body, status, required_headers, method
|
@@ -206,6 +206,11 @@ module Anmo
|
|
206
206
|
assert_equal "body2", last_response.body
|
207
207
|
end
|
208
208
|
|
209
|
+
def test_exposes_server_version
|
210
|
+
get "/__VERSION__"
|
211
|
+
assert_equal Anmo::VERSION, last_response.body
|
212
|
+
end
|
213
|
+
|
209
214
|
private
|
210
215
|
|
211
216
|
def with_host(host)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: anmo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.15
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-03-
|
12
|
+
date: 2012-03-23 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
16
|
-
requirement: &
|
16
|
+
requirement: &70248042461280 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70248042461280
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: thin
|
27
|
-
requirement: &
|
27
|
+
requirement: &70248042460780 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70248042460780
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: httparty
|
38
|
-
requirement: &
|
38
|
+
requirement: &70248042460100 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70248042460100
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
|
-
requirement: &
|
49
|
+
requirement: &70248042453360 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70248042453360
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: minitest
|
60
|
-
requirement: &
|
60
|
+
requirement: &70248042452900 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70248042452900
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rack-test
|
71
|
-
requirement: &
|
71
|
+
requirement: &70248042452460 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70248042452460
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: cucumber
|
82
|
-
requirement: &
|
82
|
+
requirement: &70248042451940 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70248042451940
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: rspec
|
93
|
-
requirement: &
|
93
|
+
requirement: &70248042451460 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *70248042451460
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: guard
|
104
|
-
requirement: &
|
104
|
+
requirement: &70248042450860 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *70248042450860
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: guard-shell
|
115
|
-
requirement: &
|
115
|
+
requirement: &70248042449960 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,7 +120,7 @@ dependencies:
|
|
120
120
|
version: '0'
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *70248042449960
|
124
124
|
description: ''
|
125
125
|
email:
|
126
126
|
- andrew.vos@gmail.com
|
@@ -131,6 +131,7 @@ files:
|
|
131
131
|
- .gitignore
|
132
132
|
- Gemfile
|
133
133
|
- Guardfile
|
134
|
+
- README.md
|
134
135
|
- Rakefile
|
135
136
|
- anmo.gemspec
|
136
137
|
- features/api.feature
|