avvo_api 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|