avvo_api 0.1.0
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/.gitignore +4 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +31 -0
- data/README.rdoc +63 -0
- data/Rakefile +19 -0
- data/avvo_api.gemspec +25 -0
- data/examples/avvo_cli.rb +74 -0
- data/lib/avvo_api.rb +28 -0
- data/lib/avvo_api/address.rb +35 -0
- data/lib/avvo_api/advanced_training.rb +35 -0
- data/lib/avvo_api/base.rb +18 -0
- data/lib/avvo_api/doctor.rb +22 -0
- data/lib/avvo_api/headshot.rb +20 -0
- data/lib/avvo_api/language.rb +16 -0
- data/lib/avvo_api/lawyer.rb +20 -0
- data/lib/avvo_api/phone.rb +37 -0
- data/lib/avvo_api/professional_methods.rb +52 -0
- data/lib/avvo_api/review.rb +21 -0
- data/lib/avvo_api/school.rb +18 -0
- data/lib/avvo_api/specialty.rb +19 -0
- data/lib/avvo_api/version.rb +3 -0
- data/test/test_helper.rb +14 -0
- data/test/unit/address_test.rb +31 -0
- data/test/unit/advanced_training_test.rb +11 -0
- data/test/unit/base_test.rb +135 -0
- data/test/unit/doctor_test.rb +46 -0
- data/test/unit/headshot_test.rb +46 -0
- data/test/unit/language_test.rb +14 -0
- data/test/unit/lawyer_test.rb +170 -0
- data/test/unit/phone_test.rb +22 -0
- data/test/unit/review_test.rb +14 -0
- data/test/unit/school_test.rb +14 -0
- data/test/unit/specialty_test.rb +14 -0
- metadata +154 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
module AvvoApi::ProfessionalMethods # :nodoc:
|
2
|
+
|
3
|
+
# Methods that are shared between professionals.
|
4
|
+
module ClassMethods
|
5
|
+
|
6
|
+
# Search avvo for a list of the top 10 professionals matching the
|
7
|
+
# passed-in parameters. Accepts the following parameters:
|
8
|
+
#
|
9
|
+
# [q] The search query
|
10
|
+
# [loc] The location to search in
|
11
|
+
#
|
12
|
+
# These parameters match the search boxes on the Avvo website.
|
13
|
+
#
|
14
|
+
# This method pre-dates the REST API, and thus returns a hash of
|
15
|
+
# data rather than API objects. Hopefully, we'll eventually come
|
16
|
+
# up with something better. To see an actual response, look at
|
17
|
+
# http://api.avvo.com/docs/get/lawyers/search.html
|
18
|
+
def search(params)
|
19
|
+
response = self.get(:search, params)
|
20
|
+
|
21
|
+
if response && response['num_results']
|
22
|
+
response
|
23
|
+
else
|
24
|
+
raise ActiveResource::ResourceNotFound.new(response)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Attempts to find a professional on Avvo that matches the
|
29
|
+
# passed-in params. Currently accepts the following params:
|
30
|
+
#
|
31
|
+
# [name] The full name of the lawyer you are trying to find
|
32
|
+
# [phone] The phone number of the lawyer, in the format XXX-XXX-XXXX
|
33
|
+
# [fax] The fax number of the lawyer, in the format XXX-XXX-XXXX
|
34
|
+
# [address] The full address of the lawyer
|
35
|
+
# [zip_code] The zip code of the lawyer
|
36
|
+
# [email_address] The e-mail address of the lawyer
|
37
|
+
def resolve(params)
|
38
|
+
response = self.get(:resolve, :params => params)
|
39
|
+
if response && response[collection_name]
|
40
|
+
response[collection_name].map do |params|
|
41
|
+
new(params.merge({"annotation" => response['annotation']}))
|
42
|
+
end
|
43
|
+
else
|
44
|
+
raise ActiveResource::ResourceNotFound.new(response)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.included(base)
|
50
|
+
base.send(:extend, ClassMethods)
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# Represents a review for a professional. One of the following
|
2
|
+
# attributes MUST be set when using this model:
|
3
|
+
#
|
4
|
+
# * doctor_id
|
5
|
+
# * lawyer_id
|
6
|
+
#
|
7
|
+
# This model has the following attributes:
|
8
|
+
#
|
9
|
+
# * id
|
10
|
+
# * overall_rating: The overall rating (out of 5 stars) given by this review.
|
11
|
+
# * title: The review's title
|
12
|
+
# * body: The first 150 characters of the review's body
|
13
|
+
# * url: A link to the review on Avvo
|
14
|
+
# * posted_by: The author of the review
|
15
|
+
# * posted_at: The date this review was posted
|
16
|
+
# * updated_at: The last time this review was updated
|
17
|
+
#
|
18
|
+
class AvvoApi::Review < AvvoApi::Base
|
19
|
+
belongs_to :lawyer
|
20
|
+
belongs_to :doctor
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Represents a school attended by a professional. One of the following
|
2
|
+
# attributes MUST be set when using this model:
|
3
|
+
#
|
4
|
+
# * doctor_id
|
5
|
+
# * lawyer_id
|
6
|
+
#
|
7
|
+
# This model has the following attributes:
|
8
|
+
#
|
9
|
+
# * id
|
10
|
+
# * name: The name of the school. When set, this will be resolved by Avvo.
|
11
|
+
# * degree_level_name: The level of degree awarded at this school. BA, BS, JD, etc. Will be resolved by Avvo.
|
12
|
+
# * degree_area_name: Major or area of study. Will be resolved by Avvo.
|
13
|
+
# * graduation_date: The date the professional graduated from this school.
|
14
|
+
#
|
15
|
+
class AvvoApi::School < AvvoApi::Base
|
16
|
+
belongs_to :lawyer
|
17
|
+
belongs_to :doctor
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Represents a specialty. One of the following attributes MUST
|
2
|
+
# be set when using this model:
|
3
|
+
#
|
4
|
+
# * doctor_id
|
5
|
+
# * lawyer_id
|
6
|
+
#
|
7
|
+
# This model has the following attributes:
|
8
|
+
#
|
9
|
+
# * id
|
10
|
+
# * specialty_name: The name of this specialty.
|
11
|
+
# * specialty_percent: The percent of time this professional spends in this specialty
|
12
|
+
# * specialty_start_date: When this professional started practicing this specialty.
|
13
|
+
# * number_cases_handled: The number of cases handled within this specialty
|
14
|
+
# * description: Additional information about this specialty.
|
15
|
+
#
|
16
|
+
class AvvoApi::Specialty < AvvoApi::Base
|
17
|
+
belongs_to :lawyer
|
18
|
+
belongs_to :doctor
|
19
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'avvo_api'
|
4
|
+
|
5
|
+
require 'shoulda'
|
6
|
+
|
7
|
+
require 'webmock/test_unit'
|
8
|
+
class Test::Unit::TestCase
|
9
|
+
include WebMock::API
|
10
|
+
end
|
11
|
+
|
12
|
+
AvvoApi.setup('test_account@avvo.com', 'password')
|
13
|
+
|
14
|
+
WebMock.disable_net_connect!
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class AvvoApi::AddressTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "AvvoApi::Address" do
|
6
|
+
should "belong_to :lawyer" do
|
7
|
+
assert_contains(AvvoApi::Address.belongs_to_associations.map(&:attribute), :lawyer)
|
8
|
+
end
|
9
|
+
should "belong_to :doctor" do
|
10
|
+
assert_contains(AvvoApi::Address.belongs_to_associations.map(&:attribute), :doctor)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context "AvvoApi::Address.main" do
|
15
|
+
|
16
|
+
setup do
|
17
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/addresses/main.json").to_return(:body => {:id => '1', :postal_code => '98122'}.to_json)
|
18
|
+
@address = AvvoApi::Address.main(:lawyer_id => 1)
|
19
|
+
end
|
20
|
+
|
21
|
+
should "hit the correct url" do
|
22
|
+
assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/addresses/main.json")
|
23
|
+
end
|
24
|
+
|
25
|
+
should "setup the object correctly" do
|
26
|
+
assert_equal '98122', @address.postal_code
|
27
|
+
assert_equal 1, @address.prefix_options[:lawyer_id]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class AvvoApi::AdvancedTrainingTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "AvvoApi::AdvancedTraining" do
|
6
|
+
should "belong_to :doctor" do
|
7
|
+
assert_contains(AvvoApi::AdvancedTraining.belongs_to_associations.map(&:attribute), :doctor)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class AvvoApi::BaseTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "A resource that inherits from AvvoApi::Base" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
@object = AvvoApi::Lawyer.new
|
9
|
+
end
|
10
|
+
|
11
|
+
should "hit the Avvo API with the correct URL when saved" do
|
12
|
+
stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers.json")
|
13
|
+
@object.save
|
14
|
+
assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers.json")
|
15
|
+
end
|
16
|
+
|
17
|
+
should "hit the Avvo API with the correct URL when retrieved" do
|
18
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1.json").to_return(:body => {:id => '1'}.to_json)
|
19
|
+
AvvoApi::Lawyer.find(1)
|
20
|
+
assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1.json")
|
21
|
+
end
|
22
|
+
|
23
|
+
context "with a has_many relationship to another object" do
|
24
|
+
should "hit the associated object's URL with the correct parameters when requested" do
|
25
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/addresses.json")
|
26
|
+
@object.id = 1
|
27
|
+
@object.addresses
|
28
|
+
assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/addresses.json")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "with a has_one relationship to another object" do
|
33
|
+
should "hit the associated object's URL with the correct parameters when requested" do
|
34
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/headshot.json").to_return(:body => {:headshot_url => "blah"}.to_json)
|
35
|
+
@object.id = 1
|
36
|
+
@object.headshot
|
37
|
+
assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/headshot.json")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "with a belongs_to association and correct parameters" do
|
42
|
+
setup do
|
43
|
+
@object = AvvoApi::Specialty.new(:lawyer_id => 2)
|
44
|
+
end
|
45
|
+
|
46
|
+
should "hit the Avvo API with the correct URL when saved" do
|
47
|
+
stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties.json")
|
48
|
+
@object.save
|
49
|
+
assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties.json")
|
50
|
+
end
|
51
|
+
|
52
|
+
should "hit the Avvo API with the correct URL when retrieved" do
|
53
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties/3.json").to_return(:body => {:id => '3'}.to_json)
|
54
|
+
AvvoApi::Specialty.find(3, :params => {:lawyer_id => 2})
|
55
|
+
assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties/3.json")
|
56
|
+
end
|
57
|
+
|
58
|
+
should "hit the Avvo API with the correct URL when updated" do
|
59
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties/3.json").to_return(:body => {:id => '3', :specialty_id => "88", :specialty_id => '88', :specialty_percent => '100'}.to_json)
|
60
|
+
license = AvvoApi::Specialty.find(3, :params => {:lawyer_id => 2})
|
61
|
+
assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties/3.json")
|
62
|
+
stub_request(:put, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties/3.json")
|
63
|
+
license.save
|
64
|
+
assert_requested(:put, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties/3.json")
|
65
|
+
end
|
66
|
+
|
67
|
+
should "set the prefix parameters correctly when saved" do
|
68
|
+
stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties.json").to_return(:body => {:id => '2', :specialty_id => "88", :specialty_id => '88', :specialty_percent => '100'}.to_json)
|
69
|
+
@object.save
|
70
|
+
assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties.json")
|
71
|
+
|
72
|
+
assert_equal "/api/1/lawyers/2/specialties/2.json", @object.send(:element_path)
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
context "with a belongs_to hierarchy and correct parameters" do
|
78
|
+
|
79
|
+
setup do
|
80
|
+
@object = AvvoApi::Phone.new(:doctor_id => 2, :address_id => 3)
|
81
|
+
end
|
82
|
+
|
83
|
+
should "allow setting the prefix options after creation" do
|
84
|
+
@object = AvvoApi::Phone.new
|
85
|
+
@object.doctor_id = 2
|
86
|
+
@object.address_id = 3
|
87
|
+
stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones.json")
|
88
|
+
@object.save
|
89
|
+
assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones.json")
|
90
|
+
end
|
91
|
+
|
92
|
+
should "allow following +belongs_to+ associations" do
|
93
|
+
@object = AvvoApi::Phone.new
|
94
|
+
@object.doctor_id = 2
|
95
|
+
@object.address_id = 3
|
96
|
+
assert_equal 3, @object.address_id
|
97
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3.json").to_return(:body => {:id => '3'}.to_json)
|
98
|
+
@object.address
|
99
|
+
@object.address
|
100
|
+
assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3.json", :times => 1)
|
101
|
+
end
|
102
|
+
|
103
|
+
should "hit the Avvo API with the correct URL when saved" do
|
104
|
+
stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones.json")
|
105
|
+
@object.save
|
106
|
+
assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones.json")
|
107
|
+
end
|
108
|
+
|
109
|
+
should "hit the Avvo API with the correct URL when updated" do
|
110
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones/4.json").to_return(:body => {:id => '4'}.to_json)
|
111
|
+
phone = AvvoApi::Phone.find(4, :params => {:doctor_id => 2, :address_id => 3})
|
112
|
+
assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones/4.json")
|
113
|
+
|
114
|
+
stub_request(:put, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones/4.json")
|
115
|
+
phone.save
|
116
|
+
assert_requested(:put, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones/4.json")
|
117
|
+
end
|
118
|
+
|
119
|
+
should "set the prefix parameters correctly when saved" do
|
120
|
+
stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones.json").to_return(:body => {:phone_type_id=>2, :id=>4, :phone_number=>"206-728-0588"}.to_json)
|
121
|
+
@object.save
|
122
|
+
assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones.json")
|
123
|
+
|
124
|
+
assert_equal "/api/1/doctors/2/addresses/3/phones/4.json", @object.send(:element_path)
|
125
|
+
end
|
126
|
+
|
127
|
+
should "hit the Avvo API with the correct URL when retrieved" do
|
128
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones/4.json").to_return(:body => {:id => '4'}.to_json)
|
129
|
+
AvvoApi::Phone.find(4, :params => {:doctor_id => 2, :address_id => 3})
|
130
|
+
assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones/4.json")
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class AvvoApi::DoctorTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "A valid doctor object" do
|
6
|
+
setup do
|
7
|
+
@doctor = AvvoApi::Doctor.new(valid_doctor_params)
|
8
|
+
stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors.json").to_return(:body => doctor_1.to_json)
|
9
|
+
end
|
10
|
+
|
11
|
+
should "#save successfully" do
|
12
|
+
assert @doctor.save, "doctor could not be saved"
|
13
|
+
assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors.json")
|
14
|
+
assert_equal "1", @doctor.id
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "AvvoApi::Doctor.resolve" do
|
19
|
+
|
20
|
+
should "return the appropriate doctors" do
|
21
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/resolve.json?params%5Bname%5D=Mark%20Britton¶ms%5Bzip_code%5D=98101").to_return(:body => {:doctors => [{:id => 1}]}.to_json)
|
22
|
+
doctors = AvvoApi::Doctor.resolve({:name => 'Mark Britton', :zip_code => 98101})
|
23
|
+
assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/resolve.json?params%5Bname%5D=Mark%20Britton¶ms%5Bzip_code%5D=98101")
|
24
|
+
assert_equal 1, doctors.length
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def valid_doctor_params
|
31
|
+
{
|
32
|
+
:firstname => 'Bob',
|
33
|
+
:lastname => 'Bobson',
|
34
|
+
:npi_number => '123456'
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def doctor_1
|
39
|
+
{
|
40
|
+
:firstname => 'Bob',
|
41
|
+
:lastname => 'Bobson',
|
42
|
+
:id => '1'
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class AvvoApi::HeadshotTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "AvvoApi::Headshot" do
|
6
|
+
|
7
|
+
should "belong_to :doctor" do
|
8
|
+
assert_contains(AvvoApi::Headshot.belongs_to_associations.map(&:attribute), :doctor)
|
9
|
+
end
|
10
|
+
|
11
|
+
should "belong_to :lawyer" do
|
12
|
+
assert_contains(AvvoApi::Headshot.belongs_to_associations.map(&:attribute), :lawyer)
|
13
|
+
end
|
14
|
+
|
15
|
+
should "get the correct url" do
|
16
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/headshot.json").to_return(:body => {:headshot_url => "blah"}.to_json)
|
17
|
+
AvvoApi::Headshot.find(:one, :params => {:lawyer_id => 1})
|
18
|
+
assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/headshot.json")
|
19
|
+
end
|
20
|
+
|
21
|
+
should "be able to create a new headshot" do
|
22
|
+
@headshot = AvvoApi::Headshot.new(:lawyer_id => 1)
|
23
|
+
stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/headshot.json")
|
24
|
+
@headshot.save
|
25
|
+
assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/headshot.json")
|
26
|
+
end
|
27
|
+
|
28
|
+
should "be able to update an existing headshot" do
|
29
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/headshot.json").to_return(:body => {:headshot_url => "blah"}.to_json)
|
30
|
+
@headshot = AvvoApi::Headshot.find(:one, :params => {:lawyer_id => 1})
|
31
|
+
stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/headshot.json")
|
32
|
+
@headshot.save
|
33
|
+
assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/headshot.json")
|
34
|
+
end
|
35
|
+
|
36
|
+
should "be able to destroy a headshot" do
|
37
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/headshot.json").to_return(:body => {:headshot_url => "blah"}.to_json)
|
38
|
+
@headshot = AvvoApi::Headshot.find(:one, :params => {:lawyer_id => 1})
|
39
|
+
stub_request(:delete, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/headshot.json")
|
40
|
+
@headshot.destroy
|
41
|
+
assert_requested(:delete, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/headshot.json")
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class AvvoApi::LanguageTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "AvvoApi::Language" do
|
6
|
+
should "belong_to :lawyer" do
|
7
|
+
assert_contains(AvvoApi::Language.belongs_to_associations.map(&:attribute), :lawyer)
|
8
|
+
end
|
9
|
+
should "belong_to :doctor" do
|
10
|
+
assert_contains(AvvoApi::Language.belongs_to_associations.map(&:attribute), :doctor)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class AvvoApi::LawyerTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "A valid lawyer object" do
|
6
|
+
setup do
|
7
|
+
@lawyer = AvvoApi::Lawyer.new(valid_lawyer_params)
|
8
|
+
stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers.json").to_return(:body => lawyer_1.to_json)
|
9
|
+
end
|
10
|
+
|
11
|
+
should "#save successfully" do
|
12
|
+
assert @lawyer.save, "lawyer could not be saved"
|
13
|
+
assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers.json")
|
14
|
+
assert_equal "1", @lawyer.id
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "An invalid lawyer object" do
|
19
|
+
setup do
|
20
|
+
@lawyer = AvvoApi::Lawyer.new(invalid_lawyer_params)
|
21
|
+
stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers.json").to_return(:body => lawyer_errors.to_json, :status => 422)
|
22
|
+
@lawyer.save
|
23
|
+
end
|
24
|
+
|
25
|
+
should "not be created on the server when #save is called" do
|
26
|
+
assert_equal nil, @lawyer.id
|
27
|
+
end
|
28
|
+
|
29
|
+
should "have errors on the firstname attribute" do
|
30
|
+
assert_match "can't be blank", @lawyer.errors.on(:firstname)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "AvvoApi::Lawyer.find" do
|
35
|
+
setup do
|
36
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1.json").to_return(:body => lawyer_1.to_json)
|
37
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2.json").to_return(:body => '', :status => 404)
|
38
|
+
end
|
39
|
+
|
40
|
+
should "return a lawyer when called with an existing id" do
|
41
|
+
@lawyer = AvvoApi::Lawyer.find(1)
|
42
|
+
assert_equal "Bob", @lawyer.firstname
|
43
|
+
assert_equal 'Mr.', @lawyer.prefix
|
44
|
+
end
|
45
|
+
|
46
|
+
should "raise an exception when called with a nonexistent id" do
|
47
|
+
assert_raises ActiveResource::ResourceNotFound do
|
48
|
+
@lawyer = AvvoApi::Lawyer.find(2)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "AvvoApi::Lawyer.search" do
|
54
|
+
setup do
|
55
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/search.json?q=dui").to_return(:body => search_results.to_json)
|
56
|
+
end
|
57
|
+
|
58
|
+
should "return a hash of lawyer info" do
|
59
|
+
@results = AvvoApi::Lawyer.search(:q => 'dui')
|
60
|
+
assert_equal 2, @results["num_results"]
|
61
|
+
assert_equal "Bill T. Lawyer", @results["results"].last["name"]
|
62
|
+
assert_equal "DUI", @results["results"].first["specialties"].first["name"]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "AvvoApi::Lawyer.resolve" do
|
67
|
+
|
68
|
+
should "return the appropriate lawyer" do
|
69
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/resolve.json?params%5Bname%5D=Mark%20Britton¶ms%5Bzip_code%5D=98101").to_return(:body => {:lawyers => [{:id => 1}]}.to_json)
|
70
|
+
lawyers = AvvoApi::Lawyer.resolve({:name => 'Mark Britton', :zip_code => 98101})
|
71
|
+
assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/resolve.json?params%5Bname%5D=Mark%20Britton¶ms%5Bzip_code%5D=98101")
|
72
|
+
assert_equal 1, lawyers.length
|
73
|
+
end
|
74
|
+
|
75
|
+
should "return an empty array if the lawyer can't be found" do
|
76
|
+
stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/resolve.json?params%5Bname%5D=Mark%20Britton¶ms%5Bzip_code%5D=98101").to_return(:body => {:lawyers => []}.to_json)
|
77
|
+
lawyers = AvvoApi::Lawyer.resolve({:name => 'Mark Britton', :zip_code => 98101})
|
78
|
+
assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/resolve.json?params%5Bname%5D=Mark%20Britton¶ms%5Bzip_code%5D=98101")
|
79
|
+
assert_equal 0, lawyers.length
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def valid_lawyer_params
|
87
|
+
{
|
88
|
+
:firstname => 'Bob',
|
89
|
+
:lastname => 'Bobson',
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
def invalid_lawyer_params
|
94
|
+
valid_lawyer_params.tap {|p| p["firstname"] = ""}
|
95
|
+
end
|
96
|
+
|
97
|
+
def lawyer_1
|
98
|
+
{
|
99
|
+
:firstname => 'Bob',
|
100
|
+
:lastname => 'Bobson',
|
101
|
+
:prefix => 'Mr.',
|
102
|
+
:id => '1'
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
def lawyer_errors
|
107
|
+
{
|
108
|
+
:errors => [
|
109
|
+
"Firstname can't be blank"
|
110
|
+
]
|
111
|
+
}
|
112
|
+
end
|
113
|
+
|
114
|
+
def search_results
|
115
|
+
{
|
116
|
+
"num_results" => 2,
|
117
|
+
"results" => [
|
118
|
+
{
|
119
|
+
"id" => 1,
|
120
|
+
"name" => "Bob the Lawyer",
|
121
|
+
"avvo_rating" => 5.0,
|
122
|
+
"client_rating" => 5.0,
|
123
|
+
"client_rating_count" => 10,
|
124
|
+
"specialties" => [
|
125
|
+
{
|
126
|
+
"name" => "DUI",
|
127
|
+
"percent" => 75
|
128
|
+
},
|
129
|
+
{
|
130
|
+
"name" => "Criminal Defense",
|
131
|
+
"percent" => 25
|
132
|
+
}
|
133
|
+
],
|
134
|
+
"sponsored" => true,
|
135
|
+
"ad_details" => {
|
136
|
+
"tagline" => "I'm the best! Pick me!",
|
137
|
+
"website" => "http://www.avvo.com"
|
138
|
+
},
|
139
|
+
"phone" => "212-555-1212",
|
140
|
+
"address" => "123 Fake St., Seattle, WA 98121",
|
141
|
+
"tiny_image_url" => "http://media.avvo.com/ugc/images/head_shot/tinythumbnail_large/1.jpg",
|
142
|
+
"image_url" => "http://media.avvo.com/ugc/images/head_shot/thumbnail_large/1.jpg",
|
143
|
+
"profile_url" => "http://www.avvo.com/attorneys/1.html",
|
144
|
+
"client_reviews_url" => "http://www.avvo.com/attorneys/1/reviews.html"
|
145
|
+
},
|
146
|
+
{
|
147
|
+
"id" => 2,
|
148
|
+
"name" => "Bill T. Lawyer",
|
149
|
+
"avvo_rating" => 10.0,
|
150
|
+
"client_rating" => 0.0,
|
151
|
+
"client_rating_count" => 0,
|
152
|
+
"specialties" => [
|
153
|
+
{
|
154
|
+
"name" => "DUI",
|
155
|
+
"percent" => 100
|
156
|
+
}
|
157
|
+
],
|
158
|
+
"sponsored" => false,
|
159
|
+
"phone" => "212-555-1213",
|
160
|
+
"address" => "123 Fake St., Suite 2B, Seattle, WA 98121",
|
161
|
+
"tiny_image_url" => "http://media.avvo.com/ugc/images/head_shot/tinythumbnail_large/2.jpg",
|
162
|
+
"image_url" => "http://media.avvo.com/ugc/images/head_shot/thumbnail_large/2.jpg",
|
163
|
+
"profile_url" => "http://www.avvo.com/attorneys/2.html",
|
164
|
+
"client_reviews_url" => "http://www.avvo.com/attorneys/2/reviews.html"
|
165
|
+
},
|
166
|
+
],
|
167
|
+
}
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|