crp 0.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 +7 -0
- data/.gitignore +20 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +65 -0
- data/Rakefile +10 -0
- data/crp.gemspec +23 -0
- data/lib/crp/result_mapper.rb +36 -0
- data/lib/crp/review_callback_response.rb +35 -0
- data/lib/crp/review_poster.rb +50 -0
- data/lib/crp/review_response.rb +29 -0
- data/lib/crp/version.rb +3 -0
- data/lib/crp.rb +8 -0
- data/test/fixtures/valid_callback_review.txt +1 -0
- data/test/fixtures/valid_review.json +6 -0
- data/test/result_mapper_test.rb +87 -0
- data/test/review_callback_response_test.rb +110 -0
- data/test/review_poster_test.rb +95 -0
- data/test/review_response_test.rb +84 -0
- data/test/test_helper.rb +25 -0
- metadata +99 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 384fb08ad5f37298a1f005bfa74cd691240ddd34
|
4
|
+
data.tar.gz: 975e4cc203e8ab982c66bff6fd9351ba4f848d3a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 821ffa6c8e96aa6516201ba1c72b8991208fec87dfa704f98581eb7875f901b090b3d6099733223fb526e3505bf7682aa94cb05c731fbd97d3fb4c880df3cadb
|
7
|
+
data.tar.gz: b8ba5b6eb1aea5cdc12b259951472063f5e3b859b006b42af33b2c7c91ae31a7ead5d51486525749e0be4cc4fa4480239fa20041a5e2aacd8d9795025d54438e
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Agile Wings
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
# CRP
|
2
|
+
|
3
|
+
The **C**entral **R**eview **P**latform is a platform to review user uploaded data. This gem wraps the CRP API in a more Ruby like syntax.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
The CRP gem is Ruby 1.9.x and 2.0.x compatible.
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'crp'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install crp
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
Create a new review:
|
24
|
+
|
25
|
+
```` ruby
|
26
|
+
require "crp"
|
27
|
+
=> true
|
28
|
+
review_poster = CRP::ReviewPoster.new("crp.example.com", "client", "key")
|
29
|
+
=> #<CRP::ReviewPoster:0x007fa2c1119110 @host="crp.example.com", @client="client", @key="key">
|
30
|
+
review_response = review_poster.new_review(1, "davy22", 123, 2, "davy22", 55)
|
31
|
+
=> #<CRP::ReviewResponse:0x007fa87c1fd020 @response=#<Net::HTTPOK 200 OK readbody=true>>
|
32
|
+
review_response.successful?
|
33
|
+
=> true
|
34
|
+
review_response.internal_id
|
35
|
+
=> 123
|
36
|
+
review_response.external_id
|
37
|
+
=> "4321"
|
38
|
+
````
|
39
|
+
|
40
|
+
You can skip the host, client and key parameters and specify the `ENV['CRP_HOST']`, `ENV['CRP_CLIENT']` and `ENV['CRP_KEY']` environment variable for convenience.
|
41
|
+
|
42
|
+
Parse the callback received from CRP:
|
43
|
+
|
44
|
+
```` ruby
|
45
|
+
require "crp"
|
46
|
+
=> true
|
47
|
+
review_callback_response = CRP::ReviewCallbackResponse.new(callback_response)
|
48
|
+
=>
|
49
|
+
review_callback_response.successful?
|
50
|
+
=> true
|
51
|
+
review_callback_response.internal_id
|
52
|
+
=> "123"
|
53
|
+
review_callback_response.external_id
|
54
|
+
=> "4321"
|
55
|
+
review_callback_response.result_code
|
56
|
+
=> 1
|
57
|
+
review_callback_response.result_message
|
58
|
+
=> "Approved"
|
59
|
+
````
|
60
|
+
|
61
|
+
**WARNING** You are responsible for listening for the callback, the gem does not handle that in any way. Note that CRP expects to see an `ok` body when sending its callback or it will keep sending the same callback over and over again.
|
62
|
+
|
63
|
+
## Contributing
|
64
|
+
|
65
|
+
Something missing? Found a bug? Horrified by the code? Open a [github issue](https://github.com/agilewings/crp_gem/issues), write a failing test or add some code using pull requests. Your help is greatly appreciated!
|
data/Rakefile
ADDED
data/crp.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'crp/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "crp"
|
8
|
+
gem.version = CRP::VERSION
|
9
|
+
gem.authors = ["Agile Wings"]
|
10
|
+
gem.email = ["noc@agilewings.com"]
|
11
|
+
gem.description = %q{Ruby interface for CRP's user uploaded data reviews.}
|
12
|
+
gem.summary = %q{The Central Review Platform is a platform to review user uploaded data. This gem wraps the CRP API in a more Ruby like syntax.}
|
13
|
+
gem.homepage = "https://github.com/agilewings/crp_gem"
|
14
|
+
gem.license = 'MIT'
|
15
|
+
|
16
|
+
gem.files = `git ls-files`.split($/)
|
17
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
18
|
+
gem.test_files = gem.files.grep(%r{^(test)/})
|
19
|
+
gem.require_paths = ["lib"]
|
20
|
+
|
21
|
+
gem.add_development_dependency 'webmock', '~> 1.13.0'
|
22
|
+
gem.add_development_dependency 'rake', '~> 10.1.0'
|
23
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
3
|
+
module CRP
|
4
|
+
class ResultMapper
|
5
|
+
def self.to_message(code)
|
6
|
+
case code
|
7
|
+
when 1
|
8
|
+
"Approved"
|
9
|
+
when 2
|
10
|
+
"Updated"
|
11
|
+
when 3
|
12
|
+
"Denied"
|
13
|
+
when 31
|
14
|
+
"Deletion requested"
|
15
|
+
when 32
|
16
|
+
"Underaged"
|
17
|
+
when 33
|
18
|
+
"Angry customer"
|
19
|
+
when 34
|
20
|
+
"Commercial"
|
21
|
+
when 61
|
22
|
+
"G-rated"
|
23
|
+
when 62
|
24
|
+
"Sexual"
|
25
|
+
when 63
|
26
|
+
"Explicit"
|
27
|
+
when 64
|
28
|
+
"Hardcore"
|
29
|
+
when 99
|
30
|
+
"Irrelevant"
|
31
|
+
else
|
32
|
+
""
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
3
|
+
module CRP
|
4
|
+
class ReviewCallbackResponse
|
5
|
+
SUCCESS_STATUS_CODE = 200
|
6
|
+
|
7
|
+
def initialize(response)
|
8
|
+
@response = response
|
9
|
+
end
|
10
|
+
|
11
|
+
def successful?
|
12
|
+
@response.code.to_i == SUCCESS_STATUS_CODE
|
13
|
+
end
|
14
|
+
|
15
|
+
def raw_review
|
16
|
+
successful? ? CGI::parse(@response.body) : {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def external_id
|
20
|
+
raw_review["externalId"].first
|
21
|
+
end
|
22
|
+
|
23
|
+
def internal_id
|
24
|
+
raw_review["internalId"].first
|
25
|
+
end
|
26
|
+
|
27
|
+
def result_code
|
28
|
+
raw_review["result"].first.to_i
|
29
|
+
end
|
30
|
+
|
31
|
+
def result_message
|
32
|
+
ResultMapper.to_message(result_code)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'net/https'
|
2
|
+
require 'openssl'
|
3
|
+
require 'json'
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
module CRP
|
7
|
+
class ReviewPoster
|
8
|
+
NEW_REVIEW_PATH = "/api/v1/Review/newReview"
|
9
|
+
|
10
|
+
def initialize(host = ENV['CRP_HOST'], client = ENV['CRP_CLIENT'], key = ENV['CRP_KEY'])
|
11
|
+
raise ArgumentError, "Missing CRP host" if host.nil? || host.strip.empty?
|
12
|
+
raise ArgumentError, "Missing CRP client" if client.nil? || client.strip.empty?
|
13
|
+
raise ArgumentError, "Missing CRP key" if key.nil? || key.strip.empty?
|
14
|
+
@host = host
|
15
|
+
@client = client
|
16
|
+
@key = key
|
17
|
+
end
|
18
|
+
|
19
|
+
def new_review(review_type, review_content, internal_review_id, gender, username, age)
|
20
|
+
uri = new_review_url(review_type, review_content, internal_review_id, gender, username, age)
|
21
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
22
|
+
http.use_ssl = true
|
23
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE # Host certificate does not cover the subdomain
|
24
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
25
|
+
response = http.request(request)
|
26
|
+
ReviewResponse.new(response)
|
27
|
+
end
|
28
|
+
|
29
|
+
def new_review_url(review_type, review_content, internal_review_id, gender, username, age)
|
30
|
+
arguments = [{
|
31
|
+
reviewType: review_type,
|
32
|
+
reviewContent: review_content,
|
33
|
+
internalReviewId: internal_review_id,
|
34
|
+
gender: gender,
|
35
|
+
username: username,
|
36
|
+
age: age
|
37
|
+
}].to_json
|
38
|
+
signature = sign_arguments(arguments)
|
39
|
+
query = URI.encode_www_form(client: @client, arguments: arguments, signature: signature)
|
40
|
+
URI::HTTPS.build({host: @host, path: NEW_REVIEW_PATH, query: query})
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def sign_arguments(arguments)
|
46
|
+
digest = OpenSSL::Digest::Digest.new("sha1")
|
47
|
+
OpenSSL::HMAC.hexdigest(digest, @key, arguments)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module CRP
|
4
|
+
class ReviewResponse
|
5
|
+
SUCCESS_STATUS_CODE = 200
|
6
|
+
EMPTY_JSON = "{}"
|
7
|
+
|
8
|
+
def initialize(response)
|
9
|
+
@response = response
|
10
|
+
end
|
11
|
+
|
12
|
+
def successful?
|
13
|
+
@response.code.to_i == SUCCESS_STATUS_CODE
|
14
|
+
end
|
15
|
+
|
16
|
+
def raw_review
|
17
|
+
body = successful? ? @response.body : EMPTY_JSON
|
18
|
+
JSON.parse(body)
|
19
|
+
end
|
20
|
+
|
21
|
+
def internal_id
|
22
|
+
raw_review.first["internalId"]
|
23
|
+
end
|
24
|
+
|
25
|
+
def external_id
|
26
|
+
raw_review.first["externalId"]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/crp/version.rb
ADDED
data/lib/crp.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
externalId=4321&result=1&internalId=123
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/test_helper")
|
2
|
+
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
module CRP
|
6
|
+
describe ResultMapper do
|
7
|
+
describe :to_message do
|
8
|
+
describe "when result code is 1" do
|
9
|
+
it "returns the approved message" do
|
10
|
+
ResultMapper.to_message(1).must_equal("Approved")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "when result code is 2" do
|
15
|
+
it "returns the updated message" do
|
16
|
+
ResultMapper.to_message(2).must_equal("Updated")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "when result code is 3" do
|
21
|
+
it "returns the denied message" do
|
22
|
+
ResultMapper.to_message(3).must_equal("Denied")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "when result code is 31" do
|
27
|
+
it "returns the deletion requested message" do
|
28
|
+
ResultMapper.to_message(31).must_equal("Deletion requested")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "when result code is 32" do
|
33
|
+
it "returns the underaged message" do
|
34
|
+
ResultMapper.to_message(32).must_equal("Underaged")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "when result code is 33" do
|
39
|
+
it "returns the angry customer message" do
|
40
|
+
ResultMapper.to_message(33).must_equal("Angry customer")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "when result code is 34" do
|
45
|
+
it "returns the commercial message" do
|
46
|
+
ResultMapper.to_message(34).must_equal("Commercial")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "when result code is 61" do
|
51
|
+
it "returns the G-rated message" do
|
52
|
+
ResultMapper.to_message(61).must_equal("G-rated")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "when result code is 62" do
|
57
|
+
it "returns the sexual message" do
|
58
|
+
ResultMapper.to_message(62).must_equal("Sexual")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "when result code is 63" do
|
63
|
+
it "returns the explicit message" do
|
64
|
+
ResultMapper.to_message(63).must_equal("Explicit")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "when result code is 64" do
|
69
|
+
it "returns the hardcore message" do
|
70
|
+
ResultMapper.to_message(64).must_equal("Hardcore")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "when result code is 99" do
|
75
|
+
it "returns the irrelevant message" do
|
76
|
+
ResultMapper.to_message(99).must_equal("Irrelevant")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "when no code is given" do
|
81
|
+
it "returns an empty string" do
|
82
|
+
ResultMapper.to_message(nil).must_equal("")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/test_helper")
|
2
|
+
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
module CRP
|
6
|
+
describe ReviewCallbackResponse do
|
7
|
+
before do
|
8
|
+
@response = Net::HTTPResponse.new(1.0, 200, "OK")
|
9
|
+
end
|
10
|
+
|
11
|
+
describe :successful? do
|
12
|
+
describe "when it succeeded" do
|
13
|
+
it "returns true" do
|
14
|
+
review_callback_response = ReviewCallbackResponse.new(@response)
|
15
|
+
review_callback_response.successful?.must_equal(true)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "when something went wrong" do
|
20
|
+
before do
|
21
|
+
@response = Net::HTTPResponse.new(1.0, 500, "Internal Server Error")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns false" do
|
25
|
+
review_callback_response = ReviewCallbackResponse.new(@response)
|
26
|
+
review_callback_response.successful?.must_equal(false)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe :raw_review do
|
32
|
+
describe "when it succeeded" do
|
33
|
+
before do
|
34
|
+
@response = MiniTest::Mock.new # can't set response.body for some reason
|
35
|
+
@response.expect(:code, "200")
|
36
|
+
@response.expect(:body, valid_callback_review_body)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns the raw review" do
|
40
|
+
review_callback_response = ReviewCallbackResponse.new(@response)
|
41
|
+
parsed_valid_callback_review_body = CGI::parse(valid_callback_review_body)
|
42
|
+
review_callback_response.raw_review.must_equal(parsed_valid_callback_review_body)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "when something went wrong" do
|
47
|
+
before do
|
48
|
+
@response = Net::HTTPResponse.new(1.0, 500, "Internal Server Error")
|
49
|
+
end
|
50
|
+
|
51
|
+
it "returns an empty raw review" do
|
52
|
+
review_callback_response = ReviewCallbackResponse.new(@response)
|
53
|
+
review_callback_response.raw_review.must_equal({})
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe :internal_id do
|
59
|
+
before do
|
60
|
+
@response = MiniTest::Mock.new # can't set response.body for some reason
|
61
|
+
@response.expect(:code, "200")
|
62
|
+
@response.expect(:body, valid_callback_review_body)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "returns the internal id from the callback response" do
|
66
|
+
review_callback_response = ReviewCallbackResponse.new(@response)
|
67
|
+
review_callback_response.internal_id.must_equal("123")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe :external_id do
|
72
|
+
before do
|
73
|
+
@response = MiniTest::Mock.new # can't set response.body for some reason
|
74
|
+
@response.expect(:code, "200")
|
75
|
+
@response.expect(:body, valid_callback_review_body)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "returns the external id from the callback response" do
|
79
|
+
review_callback_response = ReviewCallbackResponse.new(@response)
|
80
|
+
review_callback_response.external_id.must_equal("4321")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe :result_code do
|
85
|
+
before do
|
86
|
+
@response = MiniTest::Mock.new # can't set response.body for some reason
|
87
|
+
@response.expect(:code, "200")
|
88
|
+
@response.expect(:body, valid_callback_review_body)
|
89
|
+
end
|
90
|
+
|
91
|
+
it "returns the result code from the callback response" do
|
92
|
+
review_callback_response = ReviewCallbackResponse.new(@response)
|
93
|
+
review_callback_response.result_code.must_equal(1)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe :result_message do
|
98
|
+
before do
|
99
|
+
@response = MiniTest::Mock.new # can't set response.body for some reason
|
100
|
+
@response.expect(:code, "200")
|
101
|
+
@response.expect(:body, valid_callback_review_body)
|
102
|
+
end
|
103
|
+
|
104
|
+
it "returns the result message from the callback response" do
|
105
|
+
review_callback_response = ReviewCallbackResponse.new(@response)
|
106
|
+
review_callback_response.result_message.must_equal("Approved")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/test_helper")
|
2
|
+
|
3
|
+
module CRP
|
4
|
+
describe ReviewPoster do
|
5
|
+
HOST = "crp.example.com"
|
6
|
+
CLIENT = "client"
|
7
|
+
KEY = "A1B2c3DeFGhi"
|
8
|
+
REVIEW_TYPE = 1
|
9
|
+
REVIEW_CONTENT = "I am a very cheerful and good-humored."
|
10
|
+
INTERNAL_REVIEW_ID = "ABCDE12345"
|
11
|
+
GENDER = 1
|
12
|
+
USERNAME = "starryheart28"
|
13
|
+
AGE = 28
|
14
|
+
|
15
|
+
before do
|
16
|
+
@new_review_request = stub_new_review_request
|
17
|
+
end
|
18
|
+
|
19
|
+
it "accepts a host" do
|
20
|
+
review_poster = ReviewPoster.new(HOST, CLIENT, KEY)
|
21
|
+
review_poster.instance_variable_get(:@host).must_equal(HOST)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "accepts a client" do
|
25
|
+
review_poster = ReviewPoster.new(HOST, CLIENT, KEY)
|
26
|
+
review_poster.instance_variable_get(:@client).must_equal(CLIENT)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "accepts a key" do
|
30
|
+
review_poster = ReviewPoster.new(HOST, CLIENT, KEY)
|
31
|
+
review_poster.instance_variable_get(:@key).must_equal(KEY)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "requires a host" do
|
35
|
+
ENV['CRP_HOST'] = nil
|
36
|
+
lambda { ReviewPoster.new(nil, CLIENT, KEY) }.must_raise(ArgumentError)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "requires a non empty host" do
|
40
|
+
ENV['CRP_HOST'] = nil
|
41
|
+
lambda { ReviewPoster.new("", CLIENT, KEY) }.must_raise(ArgumentError)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "requires a client" do
|
45
|
+
ENV['CRP_CLIENT'] = nil
|
46
|
+
lambda { ReviewPoster.new(HOST, nil, KEY) }.must_raise(ArgumentError)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "requires a non empty client" do
|
50
|
+
ENV['CRP_CLIENT'] = nil
|
51
|
+
lambda { ReviewPoster.new(HOST, "", KEY) }.must_raise(ArgumentError)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "requires a key" do
|
55
|
+
ENV['CRP_KEY'] = nil
|
56
|
+
lambda { ReviewPoster.new(HOST, CLIENT, nil) }.must_raise(ArgumentError)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "requires a non empty key" do
|
60
|
+
ENV['CRP_KEY'] = nil
|
61
|
+
lambda { ReviewPoster.new(HOST, CLIENT, "") }.must_raise(ArgumentError)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "uses the environment variables if the host, client and key are missing" do
|
65
|
+
ENV['CRP_HOST'] = HOST
|
66
|
+
ENV['CRP_CLIENT'] = CLIENT
|
67
|
+
ENV['CRP_KEY'] = KEY
|
68
|
+
lambda { ReviewPoster.new }.must_be_silent
|
69
|
+
ENV['CRP_HOST'] = nil
|
70
|
+
ENV['CRP_CLIENT'] = nil
|
71
|
+
ENV['CRP_KEY'] = nil
|
72
|
+
end
|
73
|
+
|
74
|
+
describe :new_review do
|
75
|
+
it "sends the review to CRP" do
|
76
|
+
review_poster = ReviewPoster.new(HOST, CLIENT, KEY)
|
77
|
+
review_poster.new_review(REVIEW_TYPE, REVIEW_CONTENT, INTERNAL_REVIEW_ID, GENDER, USERNAME, AGE)
|
78
|
+
assert_requested(@new_review_request)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "returns a review response" do
|
82
|
+
review_poster = ReviewPoster.new(HOST, CLIENT, KEY)
|
83
|
+
review_poster.new_review(REVIEW_TYPE, REVIEW_CONTENT, INTERNAL_REVIEW_ID, GENDER, USERNAME, AGE).must_be_instance_of(ReviewResponse)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe :new_review_url do
|
88
|
+
it "returns the new review URI" do
|
89
|
+
review_poster = ReviewPoster.new(HOST, CLIENT, KEY)
|
90
|
+
uri = review_poster.new_review_url(REVIEW_TYPE, REVIEW_CONTENT, INTERNAL_REVIEW_ID, GENDER, USERNAME, AGE)
|
91
|
+
uri.to_s.must_equal("https://crp.example.com/api/v1/Review/newReview?client=client&arguments=%5B%7B%22reviewType%22%3A1%2C%22reviewContent%22%3A%22I+am+a+very+cheerful+and+good-humored.%22%2C%22internalReviewId%22%3A%22ABCDE12345%22%2C%22gender%22%3A1%2C%22username%22%3A%22starryheart28%22%2C%22age%22%3A28%7D%5D&signature=77ce496ea7f78ae7b6deab0d492b265a81276cb6")
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/test_helper")
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module CRP
|
6
|
+
describe ReviewResponse do
|
7
|
+
before do
|
8
|
+
@response = Net::HTTPResponse.new(1.0, 200, "OK")
|
9
|
+
end
|
10
|
+
|
11
|
+
describe :successful? do
|
12
|
+
describe "when it succeeded" do
|
13
|
+
it "returns true" do
|
14
|
+
review_response = ReviewResponse.new(@response)
|
15
|
+
review_response.successful?.must_equal(true)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "when something went wrong" do
|
20
|
+
before do
|
21
|
+
@response = Net::HTTPResponse.new(1.0, 500, "Internal Server Error")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns false" do
|
25
|
+
review_response = ReviewResponse.new(@response)
|
26
|
+
review_response.successful?.must_equal(false)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe :raw_review do
|
32
|
+
describe "when it succeeded" do
|
33
|
+
before do
|
34
|
+
@response = MiniTest::Mock.new # can't set response.body for some reason
|
35
|
+
@response.expect(:code, "200")
|
36
|
+
@response.expect(:body, valid_review_body)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns the raw review" do
|
40
|
+
review_response = ReviewResponse.new(@response)
|
41
|
+
parsed_valid_review_body = JSON.parse(valid_review_body)
|
42
|
+
review_response.raw_review.must_equal(parsed_valid_review_body)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "when something went wrong" do
|
47
|
+
before do
|
48
|
+
@response = Net::HTTPResponse.new(1.0, 500, "Internal Server Error")
|
49
|
+
end
|
50
|
+
|
51
|
+
it "returns an empty raw review" do
|
52
|
+
review_response = ReviewResponse.new(@response)
|
53
|
+
review_response.raw_review.must_equal({})
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe :internal_id do
|
59
|
+
before do
|
60
|
+
@response = MiniTest::Mock.new # can't set response.body for some reason
|
61
|
+
@response.expect(:code, "200")
|
62
|
+
@response.expect(:body, valid_review_body)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "returns the internal id from the response" do
|
66
|
+
review_response = ReviewResponse.new(@response)
|
67
|
+
review_response.internal_id.must_equal(123)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe :external_id do
|
72
|
+
before do
|
73
|
+
@response = MiniTest::Mock.new # can't set response.body for some reason
|
74
|
+
@response.expect(:code, "200")
|
75
|
+
@response.expect(:body, valid_review_body)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "returns the external id from the response" do
|
79
|
+
review_response = ReviewResponse.new(@response)
|
80
|
+
review_response.external_id.must_equal("4321")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'minitest/spec'
|
2
|
+
require 'minitest/mock'
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require 'webmock/minitest'
|
5
|
+
require 'crp'
|
6
|
+
|
7
|
+
FIXTURES_PATH = File.expand_path("#{File.dirname(__FILE__)}/fixtures")
|
8
|
+
|
9
|
+
def valid_review_body
|
10
|
+
@valid_review_body ||= File.read(File.join(FIXTURES_PATH, 'valid_review.json'))
|
11
|
+
end
|
12
|
+
|
13
|
+
def valid_callback_review_body
|
14
|
+
@valid_callback_review_body ||= File.read(File.join(FIXTURES_PATH, 'valid_callback_review.txt')).chomp
|
15
|
+
end
|
16
|
+
|
17
|
+
def stub_new_review_request
|
18
|
+
request = { :headers => {'Accept' => '*/*', 'User-Agent' => 'Ruby'} }
|
19
|
+
response = { :status => 200, :body => {}, :headers => {} }
|
20
|
+
stub_request(:get, new_review_url).with(request).to_return(response)
|
21
|
+
end
|
22
|
+
|
23
|
+
def new_review_url
|
24
|
+
"https://crp.example.com/api/v1/Review/newReview?client=client&arguments=%5B%7B%22reviewType%22%3A1%2C%22reviewContent%22%3A%22I+am+a+very+cheerful+and+good-humored.%22%2C%22internalReviewId%22%3A%22ABCDE12345%22%2C%22gender%22%3A1%2C%22username%22%3A%22starryheart28%22%2C%22age%22%3A28%7D%5D&signature=77ce496ea7f78ae7b6deab0d492b265a81276cb6"
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: crp
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Agile Wings
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-10-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: webmock
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.13.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.13.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 10.1.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 10.1.0
|
41
|
+
description: Ruby interface for CRP's user uploaded data reviews.
|
42
|
+
email:
|
43
|
+
- noc@agilewings.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- .gitignore
|
49
|
+
- Gemfile
|
50
|
+
- LICENSE
|
51
|
+
- README.md
|
52
|
+
- Rakefile
|
53
|
+
- crp.gemspec
|
54
|
+
- lib/crp.rb
|
55
|
+
- lib/crp/result_mapper.rb
|
56
|
+
- lib/crp/review_callback_response.rb
|
57
|
+
- lib/crp/review_poster.rb
|
58
|
+
- lib/crp/review_response.rb
|
59
|
+
- lib/crp/version.rb
|
60
|
+
- test/fixtures/valid_callback_review.txt
|
61
|
+
- test/fixtures/valid_review.json
|
62
|
+
- test/result_mapper_test.rb
|
63
|
+
- test/review_callback_response_test.rb
|
64
|
+
- test/review_poster_test.rb
|
65
|
+
- test/review_response_test.rb
|
66
|
+
- test/test_helper.rb
|
67
|
+
homepage: https://github.com/agilewings/crp_gem
|
68
|
+
licenses:
|
69
|
+
- MIT
|
70
|
+
metadata: {}
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options: []
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - '>='
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
requirements: []
|
86
|
+
rubyforge_project:
|
87
|
+
rubygems_version: 2.1.8
|
88
|
+
signing_key:
|
89
|
+
specification_version: 4
|
90
|
+
summary: The Central Review Platform is a platform to review user uploaded data. This
|
91
|
+
gem wraps the CRP API in a more Ruby like syntax.
|
92
|
+
test_files:
|
93
|
+
- test/fixtures/valid_callback_review.txt
|
94
|
+
- test/fixtures/valid_review.json
|
95
|
+
- test/result_mapper_test.rb
|
96
|
+
- test/review_callback_response_test.rb
|
97
|
+
- test/review_poster_test.rb
|
98
|
+
- test/review_response_test.rb
|
99
|
+
- test/test_helper.rb
|