blueline_services 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +46 -0
- data/README.md +66 -0
- data/Rakefile +26 -0
- data/blueline_services.gemspec +31 -0
- data/lib/blueline_services.rb +19 -0
- data/lib/blueline_services/configuration.rb +54 -0
- data/lib/blueline_services/dsl.rb +30 -0
- data/lib/blueline_services/person_name.rb +29 -0
- data/lib/blueline_services/request.rb +155 -0
- data/lib/blueline_services/response.rb +43 -0
- data/lib/blueline_services/screening/civil_county.rb +17 -0
- data/lib/blueline_services/screening/credit.rb +16 -0
- data/lib/blueline_services/screening/criminal_county.rb +17 -0
- data/lib/blueline_services/screening/criminal_federal.rb +17 -0
- data/lib/blueline_services/screening/criminal_security.rb +12 -0
- data/lib/blueline_services/screening/criminal_state.rb +16 -0
- data/lib/blueline_services/screening/eviction.rb +16 -0
- data/lib/blueline_services/screening/model.rb +27 -0
- data/lib/blueline_services/screening/person_search.rb +16 -0
- data/lib/blueline_services/version.rb +3 -0
- data/test/integration/initial_request_test.rb +21 -0
- data/test/test-updated.xml +111 -0
- data/test/test_helper.rb +115 -0
- data/test/unit/request_test.rb +93 -0
- data/test/unit/response_test.rb +65 -0
- data/test/unit/screening/civil_county_test.rb +12 -0
- data/test/unit/screening/credit_test.rb +12 -0
- data/test/unit/screening/criminal_county_test.rb +12 -0
- data/test/unit/screening/criminal_federal_test.rb +12 -0
- data/test/unit/screening/criminal_security_test.rb +11 -0
- data/test/unit/screening/criminal_state_test.rb +12 -0
- data/test/unit/screening/eviction_test.rb +11 -0
- data/test/unit/screening/model_test.rb +37 -0
- data/test/unit/screening/person_search_test.rb +11 -0
- metadata +229 -0
@@ -0,0 +1,43 @@
|
|
1
|
+
module BluelineServices
|
2
|
+
class Response
|
3
|
+
|
4
|
+
attr_reader :user_id, :password, :reference_id, :order_id, :order_status
|
5
|
+
attr_reader :result_status
|
6
|
+
|
7
|
+
# ErrorReport
|
8
|
+
attr_reader :error_code, :error_description
|
9
|
+
|
10
|
+
# postback
|
11
|
+
attr_reader :result_status,
|
12
|
+
:order_status_flag,
|
13
|
+
:screening_results_type,
|
14
|
+
:screening_results_media_type,
|
15
|
+
:screening_results_result_type,
|
16
|
+
:result_url
|
17
|
+
|
18
|
+
attr_reader :data
|
19
|
+
|
20
|
+
def initialize(data)
|
21
|
+
@data = data
|
22
|
+
document = Nokogiri::XML.parse(data)
|
23
|
+
@user_id = document.at("//@userId").try(:value)
|
24
|
+
@password = document.at("//@password").try(:value)
|
25
|
+
@reference_id = document.at("//ReferenceId").try(:text)
|
26
|
+
@order_id = document.at("//OrderId").try(:text)
|
27
|
+
@order_status = document.at("//OrderStatus").try(:text)
|
28
|
+
|
29
|
+
# errors
|
30
|
+
@error_code = document.at("//ErrorCode").try(:text)
|
31
|
+
@error_description = document.at("//ErrorDescription").try(:text)
|
32
|
+
|
33
|
+
# completed postback response
|
34
|
+
@result_status = document.at("//ResultStatus").try(:text)
|
35
|
+
@order_status_flag = document.at("//OrderStatus//@flag").try(:value)
|
36
|
+
@screening_results_type = document.at("//ScreeningResults//@type").try(:value)
|
37
|
+
@screening_results_media_type = document.at("//ScreeningResults//@mediaType").try(:value)
|
38
|
+
@screening_results_result_type = document.at("//ScreeningResults//@resultType").try(:value)
|
39
|
+
@result_url = document.at("//InternetWebAddress").try(:text)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module BluelineServices
|
2
|
+
module Screening
|
3
|
+
class CivilCounty
|
4
|
+
include Screening::Model
|
5
|
+
|
6
|
+
attr_accessor :region, :county
|
7
|
+
|
8
|
+
def as_xml
|
9
|
+
builder(:type => "civil", :qualifier => "county") do |xml|
|
10
|
+
xml.Region region unless region.nil?
|
11
|
+
xml.County county unless county.nil?
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module BluelineServices
|
2
|
+
module Screening
|
3
|
+
class Credit
|
4
|
+
include Screening::Model
|
5
|
+
|
6
|
+
attr_accessor :score, :fraud, :vendor
|
7
|
+
|
8
|
+
def as_xml
|
9
|
+
builder(:type => "credit") do |xml|
|
10
|
+
xml.Vendor(vendor, :score => score, :fraud => fraud)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module BluelineServices
|
2
|
+
module Screening
|
3
|
+
class CriminalCounty
|
4
|
+
include Screening::Model
|
5
|
+
|
6
|
+
attr_accessor :region, :county
|
7
|
+
|
8
|
+
def as_xml
|
9
|
+
builder(:type => "criminal", :qualifier => "county") do |xml|
|
10
|
+
xml.Region region unless region.nil?
|
11
|
+
xml.County county unless county.nil?
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module BluelineServices
|
2
|
+
module Screening
|
3
|
+
class CriminalFederal
|
4
|
+
include Screening::Model
|
5
|
+
|
6
|
+
attr_accessor :region, :district
|
7
|
+
|
8
|
+
def as_xml
|
9
|
+
builder(:type => "criminal", :qualifier => "federal") do |xml|
|
10
|
+
xml.Region region unless region.nil?
|
11
|
+
xml.District district unless district.nil?
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module BluelineServices
|
2
|
+
module Screening
|
3
|
+
class CriminalState
|
4
|
+
include Screening::Model
|
5
|
+
|
6
|
+
attr_accessor :region
|
7
|
+
|
8
|
+
def as_xml
|
9
|
+
builder(:type => "criminal", :qualifier => "statewide") do |xml|
|
10
|
+
xml.Region region unless region.nil?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module BluelineServices
|
2
|
+
module Screening
|
3
|
+
class Eviction
|
4
|
+
include Screening::Model
|
5
|
+
|
6
|
+
attr_accessor :region
|
7
|
+
|
8
|
+
def as_xml
|
9
|
+
builder(:type => "eviction", :qualifier => "statewide") do |xml|
|
10
|
+
xml.Region region unless region.nil?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module BluelineServices
|
2
|
+
module Screening
|
3
|
+
module Model
|
4
|
+
|
5
|
+
def initialize(h={})
|
6
|
+
h.each {|k,v| send("#{k}=", v) if respond_to?("#{k}=") }
|
7
|
+
end
|
8
|
+
|
9
|
+
def builder(attributes={})
|
10
|
+
Nokogiri::XML::Builder.new do |xml|
|
11
|
+
xml.send("Screening", attributes) {
|
12
|
+
yield xml if block_given?
|
13
|
+
}
|
14
|
+
end.parent.root
|
15
|
+
end
|
16
|
+
|
17
|
+
def as_xml
|
18
|
+
raise NotImplementedError
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_xml
|
22
|
+
as_xml.to_xml
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module BluelineServices
|
2
|
+
module Screening
|
3
|
+
class PersonSearch
|
4
|
+
include Screening::Model
|
5
|
+
|
6
|
+
attr_accessor :vendor
|
7
|
+
|
8
|
+
def as_xml
|
9
|
+
builder(:type => "personsearch") do |xml|
|
10
|
+
xml.Vendor vendor unless vendor.nil?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module BluelineServices
|
4
|
+
class InitialRequestTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
context "#submit" do
|
7
|
+
context "with no credentials" do
|
8
|
+
subject { Request.new }
|
9
|
+
|
10
|
+
should "get an error response" do
|
11
|
+
response = subject.submit
|
12
|
+
assert_equal "x:error", response.order_status
|
13
|
+
assert_equal "120", response.error_code
|
14
|
+
assert_equal "Invalid login transaction. Bad credentials.",
|
15
|
+
response.error_description
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<BackgroundCheck password="" userId="">
|
3
|
+
<BackgroundSearchPackage action="submit" type="TST Media">
|
4
|
+
<ReferenceId>112233</ReferenceId>
|
5
|
+
<PersonalData>
|
6
|
+
<EmailAddresss></EmailAddresss>
|
7
|
+
<Telephone></Telephone>
|
8
|
+
<PersonName>
|
9
|
+
<GivenName>HANK</GivenName>
|
10
|
+
<MiddleName></MiddleName>
|
11
|
+
<FamilyName>MESS</FamilyName>
|
12
|
+
</PersonName>
|
13
|
+
<DemographicDetail>
|
14
|
+
<GovernmentId countryCode="US" issuingAuthority="SSN">333-22-1111</GovernmentId>
|
15
|
+
</DemographicDetail>
|
16
|
+
<PostalAddress>
|
17
|
+
<PostalCode>60750</PostalCode>
|
18
|
+
<Region>IL</Region>
|
19
|
+
<Municipality>FANTASY ISLAND</Municipality>
|
20
|
+
<DeliveryAddress>
|
21
|
+
<AddressLine>899</AddressLine>
|
22
|
+
<StreetName>LINCOLN RD</StreetName>
|
23
|
+
</DeliveryAddress>
|
24
|
+
</PostalAddress>
|
25
|
+
</PersonalData>
|
26
|
+
<Screenings useConfigurationDefaults="no">
|
27
|
+
<!-- Person Search / SSN verification -->
|
28
|
+
<Screening type="personsearch">
|
29
|
+
</Screening>
|
30
|
+
<!-- County Criminal -->
|
31
|
+
<Screening type="criminal" qualifier="county">
|
32
|
+
</Screening>
|
33
|
+
<!-- Federal Criminal -->
|
34
|
+
<Screening type="criminal" qualifier="federal">
|
35
|
+
</Screening>
|
36
|
+
<!-- Instant Nationwide DB check -->
|
37
|
+
<Screening type="criminal" qualifier="national">
|
38
|
+
</Screening>
|
39
|
+
<!-- Manual Statewide Criminal -->
|
40
|
+
<Screening type="criminal" qualifier="statewide">
|
41
|
+
</Screening>
|
42
|
+
<!-- Employment Verification -->
|
43
|
+
<Screening type="employment" verify="yes">
|
44
|
+
<OrganizationName>Burger Shack</OrganizationName>
|
45
|
+
<Title>Fry Cook</Title>
|
46
|
+
<StartDate>2005-05-05</StartDate>
|
47
|
+
<EndDate>2005-06-16</EndDate>
|
48
|
+
<Compensation>6.50/hr</Compensation>
|
49
|
+
<ContactInfo>
|
50
|
+
<PersonName>
|
51
|
+
<FormattedName>Susan Boss</FormattedName>
|
52
|
+
</PersonName>
|
53
|
+
<Telephone>801-123-4567</Telephone>
|
54
|
+
<Fax>801-999-9999</Fax>
|
55
|
+
<EmailAddress>susan@example.com</EmailAddress>
|
56
|
+
<PostalAddress>
|
57
|
+
<PostalCode>84020</PostalCode>
|
58
|
+
<Region>UT</Region>
|
59
|
+
<Municipality>Draper</Municipality>
|
60
|
+
<DeliveryAddress>
|
61
|
+
<AddressLine>1192</AddressLine>
|
62
|
+
<StreetName>Draper Parkway #401</StreetName>
|
63
|
+
</DeliveryAddress>
|
64
|
+
</PostalAddress>
|
65
|
+
</ContactInfo>
|
66
|
+
</Screening>
|
67
|
+
<!-- Education Verification -->
|
68
|
+
<Screening type="education">
|
69
|
+
<Region>UT</Region>
|
70
|
+
<EducationHistory>
|
71
|
+
<SchoolOrInstitution schoolType="university">
|
72
|
+
<SchoolName>UNIVERSITY OF UTAH</SchoolName>
|
73
|
+
<LocationSummary>
|
74
|
+
<Municipality>SALT LAKE CITY</Municipality>
|
75
|
+
<Region>UT</Region>
|
76
|
+
</LocationSummary>
|
77
|
+
<Degree degreeType="bachelors">
|
78
|
+
<DegreeName>COMMUNICATIONS</DegreeName>
|
79
|
+
</Degree>
|
80
|
+
<DatesOfAttendance>
|
81
|
+
<StartDate>
|
82
|
+
<StringDate>2002-09 TO 2006-01</StringDate>
|
83
|
+
</StartDate>
|
84
|
+
</DatesOfAttendance>
|
85
|
+
</SchoolOrInstitution>
|
86
|
+
</EducationHistory>
|
87
|
+
</Screening>
|
88
|
+
<!-- Instant Driving Records -->
|
89
|
+
<Screening type="license" qualifier="imvPersonal">
|
90
|
+
<Region>UT</Region>
|
91
|
+
<SearchLicense>
|
92
|
+
<License>
|
93
|
+
<LicenseNumber>123456789</LicenseNumber>
|
94
|
+
<LicensingAgency>UT</LicensingAgency>
|
95
|
+
<LicenseName>mvPersonal</LicenseName>
|
96
|
+
</License>
|
97
|
+
</SearchLicense>
|
98
|
+
</Screening>
|
99
|
+
|
100
|
+
<AdditionalItems type="x:postback_username">
|
101
|
+
<Text>user</Text>
|
102
|
+
</AdditionalItems>
|
103
|
+
<AdditionalItems type="x:postback_password">
|
104
|
+
<Text>secret</Text>
|
105
|
+
</AdditionalItems>
|
106
|
+
<AdditionalItems type="x:postback_url">
|
107
|
+
<Text>http://127.0.0.1/listen.php</Text>
|
108
|
+
</AdditionalItems>
|
109
|
+
</Screenings>
|
110
|
+
</BackgroundSearchPackage>
|
111
|
+
</BackgroundCheck>
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'shoulda'
|
4
|
+
require 'mocha'
|
5
|
+
require 'blueline_services'
|
6
|
+
|
7
|
+
class Test::Unit::TestCase
|
8
|
+
|
9
|
+
def self.should_have_attr_accessor(*args)
|
10
|
+
should "have attr_accessor for #{args.inspect}" do
|
11
|
+
args.each do |a|
|
12
|
+
assert_respond_to subject, a
|
13
|
+
assert_respond_to subject, "#{a}="
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.should_have_attr_reader(*args)
|
19
|
+
should "have attr_reader for #{args.inspect}" do
|
20
|
+
args.each do |a|
|
21
|
+
assert_respond_to subject, a
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.should_call_builder_with(*args)
|
27
|
+
should "should set type and qualifier attributes" do
|
28
|
+
node = mock
|
29
|
+
subject.expects(:builder).
|
30
|
+
with(*args).
|
31
|
+
returns(node)
|
32
|
+
assert_equal node, subject.as_xml
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def assert_xml_attr_equal(node, method_name, attribute_name=method_name)
|
37
|
+
assert_equal subject.send(method_name).to_s,
|
38
|
+
node.at("//@#{attribute_name}").value
|
39
|
+
end
|
40
|
+
|
41
|
+
def assert_xml_text_equal(node, method_name, attribute_name=method_name.to_s.camelize)
|
42
|
+
expected = subject.send(method_name).to_s
|
43
|
+
actual = node.at("//#{attribute_name}").try(:text).to_s
|
44
|
+
#puts "for #{method_name}, assert_equal #{expected}, #{actual}"
|
45
|
+
assert_equal expected, actual
|
46
|
+
end
|
47
|
+
|
48
|
+
TEST_HASH = {
|
49
|
+
:user_name => "username",
|
50
|
+
:password => "password",
|
51
|
+
:type => "My Package",
|
52
|
+
:reference_id => 112233,
|
53
|
+
:given_name => "HANK",
|
54
|
+
:family_name => "MESS",
|
55
|
+
:ssn => "333-22-1111",
|
56
|
+
:date_of_birth => "1960-01-01",
|
57
|
+
:postal_code => "60750",
|
58
|
+
:region => "IL",
|
59
|
+
:municipality => "FANTASY ISLAND",
|
60
|
+
:address_line => 899,
|
61
|
+
:street_name => "LINCOLN RD",
|
62
|
+
:postback_url => "http://127.0.0.1/listen.php",
|
63
|
+
:postback_username => "user",
|
64
|
+
:postback_password => "secret",
|
65
|
+
:use_defaults => true
|
66
|
+
}
|
67
|
+
|
68
|
+
TEST_ERROR_RESPONSE = %Q{
|
69
|
+
<BackgroundReports>
|
70
|
+
<BackgroundReportPackage>
|
71
|
+
<ReferenceId>some_id_value</ReferenceId>
|
72
|
+
<ScreeningStatus>
|
73
|
+
<OrderStatus>x:error</OrderStatus>
|
74
|
+
</ScreeningStatus>
|
75
|
+
<ErrorReport>
|
76
|
+
<ErrorCode>4</ErrorCode>
|
77
|
+
<ErrorDescription>Invalid username and/or password.</ErrorDescription>
|
78
|
+
</ErrorReport>
|
79
|
+
</BackgroundReportPackage>
|
80
|
+
</BackgroundReports>
|
81
|
+
}
|
82
|
+
|
83
|
+
TEST_PENDING_RESPONSE = %Q{
|
84
|
+
<BackgroundReports>
|
85
|
+
<BackgroundReportPackage>
|
86
|
+
<ReferenceId>some_id_value</ReferenceId>
|
87
|
+
<OrderId>12358</OrderId>
|
88
|
+
<ScreeningStatus>
|
89
|
+
<OrderStatus>x:pending</OrderStatus>
|
90
|
+
</ScreeningStatus>
|
91
|
+
</BackgroundReportPackage>
|
92
|
+
</BackgroundReports>
|
93
|
+
}
|
94
|
+
|
95
|
+
TEST_CALLBACK_RESPONSE = %Q{
|
96
|
+
<BackgroundReports userId="username" password="password">
|
97
|
+
<BackgroundReportPackage>
|
98
|
+
<ReferenceId>some_id_value</ReferenceId>
|
99
|
+
<OrderId>12358</OrderId>
|
100
|
+
<ScreeningStatus>
|
101
|
+
<OrderStatus flag="FALSE">x:ready</OrderStatus>
|
102
|
+
<ResultStatus>Pass</ResultStatus>
|
103
|
+
</ScreeningStatus>
|
104
|
+
<Screenings>
|
105
|
+
<Screening>
|
106
|
+
<ScreeningResults type="result" mediaType="html" resultType="report">
|
107
|
+
<InternetWebAddress>display.php</InternetWebAddress>
|
108
|
+
</ScreeningResults>
|
109
|
+
</Screening>
|
110
|
+
</Screenings>
|
111
|
+
</BackgroundReportPackage>
|
112
|
+
</BackgroundReports>
|
113
|
+
}
|
114
|
+
|
115
|
+
end
|