blueline_services 0.1.5

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.
Files changed (37) hide show
  1. data/.gitignore +3 -0
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +46 -0
  4. data/README.md +66 -0
  5. data/Rakefile +26 -0
  6. data/blueline_services.gemspec +31 -0
  7. data/lib/blueline_services.rb +19 -0
  8. data/lib/blueline_services/configuration.rb +54 -0
  9. data/lib/blueline_services/dsl.rb +30 -0
  10. data/lib/blueline_services/person_name.rb +29 -0
  11. data/lib/blueline_services/request.rb +155 -0
  12. data/lib/blueline_services/response.rb +43 -0
  13. data/lib/blueline_services/screening/civil_county.rb +17 -0
  14. data/lib/blueline_services/screening/credit.rb +16 -0
  15. data/lib/blueline_services/screening/criminal_county.rb +17 -0
  16. data/lib/blueline_services/screening/criminal_federal.rb +17 -0
  17. data/lib/blueline_services/screening/criminal_security.rb +12 -0
  18. data/lib/blueline_services/screening/criminal_state.rb +16 -0
  19. data/lib/blueline_services/screening/eviction.rb +16 -0
  20. data/lib/blueline_services/screening/model.rb +27 -0
  21. data/lib/blueline_services/screening/person_search.rb +16 -0
  22. data/lib/blueline_services/version.rb +3 -0
  23. data/test/integration/initial_request_test.rb +21 -0
  24. data/test/test-updated.xml +111 -0
  25. data/test/test_helper.rb +115 -0
  26. data/test/unit/request_test.rb +93 -0
  27. data/test/unit/response_test.rb +65 -0
  28. data/test/unit/screening/civil_county_test.rb +12 -0
  29. data/test/unit/screening/credit_test.rb +12 -0
  30. data/test/unit/screening/criminal_county_test.rb +12 -0
  31. data/test/unit/screening/criminal_federal_test.rb +12 -0
  32. data/test/unit/screening/criminal_security_test.rb +11 -0
  33. data/test/unit/screening/criminal_state_test.rb +12 -0
  34. data/test/unit/screening/eviction_test.rb +11 -0
  35. data/test/unit/screening/model_test.rb +37 -0
  36. data/test/unit/screening/person_search_test.rb +11 -0
  37. 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,12 @@
1
+ module BluelineServices
2
+ module Screening
3
+ class CriminalSecurity
4
+ include Screening::Model
5
+
6
+ def as_xml
7
+ builder(:type => "criminal", :qualifier => "security")
8
+ end
9
+
10
+ end
11
+ end
12
+ 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,3 @@
1
+ module BluelineServices
2
+ VERSION = "0.1.5"
3
+ 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>
@@ -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