sparqcode-dnsimple-ruby 1.2.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. data/.bundle/config +3 -0
  2. data/.rvmrc +1 -0
  3. data/Gemfile +16 -0
  4. data/Gemfile.lock +71 -0
  5. data/LICENSE +22 -0
  6. data/README +125 -0
  7. data/README.rdoc +125 -0
  8. data/README.textile +161 -0
  9. data/Rakefile +33 -0
  10. data/VERSION +1 -0
  11. data/bin/dnsimple +4 -0
  12. data/bin/dnsimple.rb +153 -0
  13. data/dnsimple-ruby.gemspec +191 -0
  14. data/features/README +12 -0
  15. data/features/cli/certificates/purchase_certificate.feature +10 -0
  16. data/features/cli/contacts/create_contact.feature +10 -0
  17. data/features/cli/domains/check_domain.feature +10 -0
  18. data/features/cli/domains/create_domain.feature +10 -0
  19. data/features/cli/domains/delete_domain.feature +11 -0
  20. data/features/cli/domains/register_domain.feature +10 -0
  21. data/features/cli/records/create_ptr_record.feature +11 -0
  22. data/features/cli/records/create_record.feature +12 -0
  23. data/features/cli/records/delete_record.feature +14 -0
  24. data/features/cli/templates/apply_template.feature +11 -0
  25. data/features/step_definitions/certificate_steps.rb +3 -0
  26. data/features/step_definitions/cli_steps.rb +8 -0
  27. data/features/step_definitions/domain_steps.rb +32 -0
  28. data/features/step_definitions/record_steps.rb +38 -0
  29. data/features/step_definitions/template_steps.rb +9 -0
  30. data/features/support/env.rb +17 -0
  31. data/fixtures/vcr_cassettes/DNSimple_Certificate/_all.yml +44 -0
  32. data/fixtures/vcr_cassettes/DNSimple_Certificate/_purchase.yml +44 -0
  33. data/fixtures/vcr_cassettes/DNSimple_Certificate/_submit.yml +44 -0
  34. data/fixtures/vcr_cassettes/DNSimple_Contact/a_new_contact.yml +42 -0
  35. data/fixtures/vcr_cassettes/DNSimple_Contact/an_existing_contact.yml +42 -0
  36. data/fixtures/vcr_cassettes/DNSimple_Domain/_all.yml +130 -0
  37. data/fixtures/vcr_cassettes/DNSimple_Domain/applying_templates.yml +216 -0
  38. data/fixtures/vcr_cassettes/DNSimple_Domain/creating_a_new_domain.yml +44 -0
  39. data/fixtures/vcr_cassettes/DNSimple_Domain/finding_an_existing_domain/by_id.yml +44 -0
  40. data/fixtures/vcr_cassettes/DNSimple_Domain/finding_an_existing_domain/by_name.yml +44 -0
  41. data/fixtures/vcr_cassettes/DNSimple_Domain/registration/with_a_new_registrant_contact.yml +44 -0
  42. data/fixtures/vcr_cassettes/DNSimple_Domain/registration/with_an_existing_contact.yml +44 -0
  43. data/fixtures/vcr_cassettes/DNSimple_Domain/setting_name_servers.yml +30 -0
  44. data/fixtures/vcr_cassettes/DNSimple_ExtendedAttribute/list_extended_attributes/for_ca.yml +40 -0
  45. data/fixtures/vcr_cassettes/DNSimple_ExtendedAttribute/list_extended_attributes/for_com.yml +40 -0
  46. data/fixtures/vcr_cassettes/DNSimple_Record/_all.yml +173 -0
  47. data/fixtures/vcr_cassettes/DNSimple_Record/creating_a_new_record.yml +44 -0
  48. data/fixtures/vcr_cassettes/DNSimple_Record/find_a_record.yml +44 -0
  49. data/fixtures/vcr_cassettes/DNSimple_Template/a_template.yml +44 -0
  50. data/fixtures/vcr_cassettes/DNSimple_User/_me.yml +42 -0
  51. data/lib/dnsimple.rb +19 -0
  52. data/lib/dnsimple/certificate.rb +158 -0
  53. data/lib/dnsimple/cli.rb +122 -0
  54. data/lib/dnsimple/client.rb +74 -0
  55. data/lib/dnsimple/command.rb +10 -0
  56. data/lib/dnsimple/commands/add_service.rb +16 -0
  57. data/lib/dnsimple/commands/add_template_record.rb +18 -0
  58. data/lib/dnsimple/commands/apply_template.rb +15 -0
  59. data/lib/dnsimple/commands/check_domain.rb +11 -0
  60. data/lib/dnsimple/commands/clear_domain.rb +16 -0
  61. data/lib/dnsimple/commands/create_contact.rb +21 -0
  62. data/lib/dnsimple/commands/create_domain.rb +16 -0
  63. data/lib/dnsimple/commands/create_record.rb +20 -0
  64. data/lib/dnsimple/commands/create_template.rb +14 -0
  65. data/lib/dnsimple/commands/delete_contact.rb +14 -0
  66. data/lib/dnsimple/commands/delete_domain.rb +14 -0
  67. data/lib/dnsimple/commands/delete_record.rb +16 -0
  68. data/lib/dnsimple/commands/delete_template.rb +13 -0
  69. data/lib/dnsimple/commands/delete_template_record.rb +16 -0
  70. data/lib/dnsimple/commands/describe_certificate.rb +34 -0
  71. data/lib/dnsimple/commands/describe_contact.rb +25 -0
  72. data/lib/dnsimple/commands/describe_domain.rb +14 -0
  73. data/lib/dnsimple/commands/describe_record.rb +16 -0
  74. data/lib/dnsimple/commands/describe_service.rb +12 -0
  75. data/lib/dnsimple/commands/describe_user.rb +18 -0
  76. data/lib/dnsimple/commands/list_applied_services.rb +16 -0
  77. data/lib/dnsimple/commands/list_available_services.rb +16 -0
  78. data/lib/dnsimple/commands/list_certificates.rb +15 -0
  79. data/lib/dnsimple/commands/list_contacts.rb +13 -0
  80. data/lib/dnsimple/commands/list_domains.rb +13 -0
  81. data/lib/dnsimple/commands/list_extended_attributes.rb +25 -0
  82. data/lib/dnsimple/commands/list_records.rb +21 -0
  83. data/lib/dnsimple/commands/list_services.rb +14 -0
  84. data/lib/dnsimple/commands/list_template_records.rb +17 -0
  85. data/lib/dnsimple/commands/list_templates.rb +13 -0
  86. data/lib/dnsimple/commands/purchase_certificate.rb +19 -0
  87. data/lib/dnsimple/commands/register_domain.rb +33 -0
  88. data/lib/dnsimple/commands/remove_service.rb +14 -0
  89. data/lib/dnsimple/commands/submit_certificate.rb +19 -0
  90. data/lib/dnsimple/commands/transfer_domain.rb +21 -0
  91. data/lib/dnsimple/commands/update_contact.rb +25 -0
  92. data/lib/dnsimple/commands/update_record.rb +23 -0
  93. data/lib/dnsimple/contact.rb +181 -0
  94. data/lib/dnsimple/domain.rb +246 -0
  95. data/lib/dnsimple/error.rb +32 -0
  96. data/lib/dnsimple/extended_attribute.rb +73 -0
  97. data/lib/dnsimple/record.rb +128 -0
  98. data/lib/dnsimple/service.rb +58 -0
  99. data/lib/dnsimple/template.rb +91 -0
  100. data/lib/dnsimple/template_record.rb +103 -0
  101. data/lib/dnsimple/transfer_order.rb +45 -0
  102. data/lib/dnsimple/user.rb +44 -0
  103. data/spec/README +10 -0
  104. data/spec/certificate_spec.rb +46 -0
  105. data/spec/command_spec.rb +19 -0
  106. data/spec/commands/add_service_spec.rb +29 -0
  107. data/spec/commands/create_record_spec.rb +23 -0
  108. data/spec/commands/list_records_spec.rb +34 -0
  109. data/spec/commands/purchase_certificate_spec.rb +24 -0
  110. data/spec/commands/submit_certificate_spec.rb +19 -0
  111. data/spec/contact_spec.rb +35 -0
  112. data/spec/domain_spec.rb +97 -0
  113. data/spec/extended_attributes_spec.rb +19 -0
  114. data/spec/record_spec.rb +59 -0
  115. data/spec/spec_helper.rb +22 -0
  116. data/spec/template_spec.rb +11 -0
  117. data/spec/user_spec.rb +23 -0
  118. metadata +353 -0
@@ -0,0 +1,45 @@
1
+ module DNSimple #:nodoc:
2
+ # Class representing a transfer order in DNSimple
3
+ class TransferOrder
4
+ include HTTParty
5
+
6
+ attr_accessor :id
7
+
8
+ attr_accessor :status
9
+
10
+ def initialize(attributes)
11
+ attributes.each do |key, value|
12
+ m = "#{key}=".to_sym
13
+ self.send(m, value) if self.respond_to?(m)
14
+ end
15
+ end
16
+
17
+ def self.create(name, authinfo='', registrant={}, extended_attributes={}, options={})
18
+ body = {:domain => {:name => name}, :transfer_order => {:authinfo => authinfo}}
19
+
20
+ if registrant[:id]
21
+ body[:domain][:registrant_id] = registrant[:id]
22
+ else
23
+ body.merge!(:contact => Contact.resolve_attributes(registrant))
24
+ end
25
+
26
+ body.merge!(:extended_attribute => extended_attributes)
27
+
28
+ options.merge!({:body => body})
29
+ options.merge!({:basic_auth => Client.credentials})
30
+
31
+ response = self.post("#{Client.base_uri}/domain_transfers.json", options)
32
+
33
+ pp response if Client.debug?
34
+
35
+ case response.code
36
+ when 201
37
+ return TransferOrder.new(response["transfer_order"])
38
+ when 401
39
+ raise RuntimeError, "Authentication failed"
40
+ else
41
+ raise DNSimple::Error.new(name, response["errors"])
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,44 @@
1
+ module DNSimple
2
+ class User
3
+ include HTTParty
4
+
5
+ attr_accessor :id
6
+
7
+ attr_accessor :created_at
8
+
9
+ attr_accessor :updated_at
10
+
11
+ attr_accessor :email
12
+
13
+ attr_accessor :login_count
14
+
15
+ attr_accessor :failed_login_count
16
+
17
+ attr_accessor :domain_count
18
+
19
+ attr_accessor :domain_limit
20
+
21
+ def initialize(attributes)
22
+ attributes.each do |key, value|
23
+ m = "#{key}=".to_sym
24
+ self.send(m, value) if self.respond_to?(m)
25
+ end
26
+ end
27
+
28
+ def self.me(options={})
29
+ options.merge!({:basic_auth => Client.credentials})
30
+ response = self.get("#{Client.base_uri}/users/me.json", options)
31
+
32
+ case response.code
33
+ when 200
34
+ return User.new(response["user"])
35
+ when 401
36
+ raise DNSimple::AuthenticationFailed, "Authentication failed"
37
+ when 404
38
+ raise DNSimple::UserNotFound, "Could not find user"
39
+ else
40
+ raise DNSimple::Error, "Error: #{response.code} #{response.message}"
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,10 @@
1
+ Before running the DNSimple Ruby Client specifications, you must do the following:
2
+
3
+ 1.) If you haven't already create a new account at https://test.dnsimple.com and activate it using the credit card number of "1"
4
+
5
+ 2.) Create a file in your home directory called .dnsimple.test and include the following:
6
+
7
+ username: YOUR_USERNAME
8
+ password: YOUR_PASSWORD
9
+ site: https://test.dnsimple.com
10
+
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe DNSimple::Certificate do
4
+ let(:domain_name) { 'example.com' }
5
+ let(:domain) { DNSimple::Domain.new(:name => domain_name) }
6
+
7
+ describe "#fqdn" do
8
+ it "joins the name and domain name" do
9
+ certificate = DNSimple::Certificate.new(:name => 'www')
10
+ certificate.domain = domain
11
+ certificate.fqdn.should eq("www.#{domain_name}")
12
+ end
13
+ it "strips blank parts from name" do
14
+ certificate = DNSimple::Certificate.new(:name => '')
15
+ certificate.domain = domain
16
+ certificate.fqdn.should eq(domain_name)
17
+ end
18
+ end
19
+
20
+ describe ".purchase" do
21
+ let(:contact) { DNSimple::Contact.new(:id => 1) }
22
+ use_vcr_cassette
23
+ it "purchases a certificate" do
24
+ certificate = DNSimple::Certificate.purchase(domain, 'www', contact)
25
+ certificate.fqdn.should eq("www.#{domain_name}")
26
+ end
27
+ end
28
+
29
+ describe ".all" do
30
+ use_vcr_cassette
31
+ it "returns all certificates for the specific domain" do
32
+ certificates = DNSimple::Certificate.all(domain)
33
+ certificates.length.should eq(1)
34
+ certificates.first.fqdn.should eq('www.example.com')
35
+ end
36
+ end
37
+
38
+ describe "#submit" do
39
+ use_vcr_cassette
40
+ let(:certificate) { DNSimple::Certificate.new(:id => 1, :domain => domain) }
41
+ it "submits a certificate for purchase" do
42
+ certificate.submit("admin@example.com")
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+ require 'dnsimple/command'
3
+
4
+ class FakeCommand < DNSimple::Command
5
+ def execute
6
+ say "done"
7
+ end
8
+ end
9
+
10
+ describe DNSimple::Command do
11
+ describe "#say" do
12
+ it "writes to the output" do
13
+ s = StringIO.new
14
+ command = FakeCommand.new(s)
15
+ command.execute
16
+ s.string.should eq("done\n")
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'dnsimple/commands/add_service'
3
+
4
+ describe DNSimple::Commands::AddService do
5
+ let(:out) { StringIO.new }
6
+
7
+ let(:domain_name) { 'example.com' }
8
+ let(:short_name) { 'service-name' }
9
+ let(:args) { [domain_name, short_name] }
10
+
11
+ let(:domain) { DNSimple::Domain.new(:name => domain_name) }
12
+ let(:service) { stub("service", :name => "Service") }
13
+
14
+ before do
15
+ DNSimple::Domain.expects(:find).with(domain_name).returns(domain)
16
+ DNSimple::Service.expects(:find).with(short_name).returns(service)
17
+ end
18
+
19
+ it "adds a service to a domain" do
20
+ domain.expects(:add_service).with(short_name)
21
+ DNSimple::Commands::AddService.new(out).execute(args)
22
+ end
23
+
24
+ it "reports to the caller" do
25
+ domain.stubs(:add_service)
26
+ DNSimple::Commands::AddService.new(out).execute(args)
27
+ out.string.should eq("Added #{service.name} to #{domain_name}\n")
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'dnsimple/domain'
3
+ require 'dnsimple/record'
4
+ require 'dnsimple/commands/create_record'
5
+
6
+ describe DNSimple::Commands::CreateRecord do
7
+ let(:out) { StringIO.new }
8
+ let(:domain_name) { 'example.com' }
9
+ let(:record_name) { 'www' }
10
+ let(:record_type) { 'CNAME' }
11
+ let(:ttl) { "3600" }
12
+ context "with one argument" do
13
+ it "purchases the certificate" do
14
+ domain_stub = stub("domain", :name => domain_name)
15
+ record_stub = stub("record", :id => 1, :record_type => record_type)
16
+ DNSimple::Domain.expects(:find).with(domain_name).returns(domain_stub)
17
+ DNSimple::Record.expects(:create).with(domain_stub, record_name, record_type, domain_name, :ttl => ttl, :prio => nil).returns(record_stub)
18
+
19
+ DNSimple::Commands::CreateRecord.new(out).execute([domain_name, record_name, record_type, domain_name, ttl])
20
+ end
21
+ end
22
+ end
23
+
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+ require 'dnsimple/commands/list_records'
3
+
4
+ describe DNSimple::Commands::ListRecords do
5
+ before do
6
+ DNSimple::Record.expects(:all).with(instance_of(DNSimple::Domain)).returns(records)
7
+ end
8
+
9
+ let(:records) { [ record ] }
10
+ let(:record) { stub(:ttl => ttl, :id => id, :record_type => record_type, :name => name, :domain => domain, :content => content) }
11
+
12
+ let(:ttl) { 'ttl' }
13
+ let(:id) { 'id' }
14
+ let(:record_type) { 'A' }
15
+ let(:name) { 'name' }
16
+ let(:content) { 'content' }
17
+
18
+ let(:args) { [ domain_name ] }
19
+ let(:domain_name) { 'example.com' }
20
+ let(:domain) { DNSimple::Domain.new(:name => domain_name) }
21
+ let(:out) { StringIO.new }
22
+
23
+ it 'should retrieve all records and print them' do
24
+ described_class.new(out).execute(args)
25
+
26
+ out.string.should include(ttl)
27
+ out.string.should include(id)
28
+ out.string.should include(record_type)
29
+ out.string.should include(name)
30
+ out.string.should include(domain_name)
31
+ out.string.should include(content)
32
+ end
33
+ end
34
+
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'dnsimple/certificate'
3
+ require 'dnsimple/commands/purchase_certificate'
4
+
5
+ describe DNSimple::Commands::PurchaseCertificate do
6
+
7
+ let(:out) { StringIO.new }
8
+ let(:domain_name) { 'example.com' }
9
+ let(:domain) { DNSimple::Domain.new(:name => domain_name) }
10
+ let(:contact_id) { 123 }
11
+ let(:contact) { DNSimple::Contact.new(:first_name => 'John', :last_name => 'Doe') }
12
+ let(:name) { "John Doe" }
13
+
14
+ context "with one argument" do
15
+ it "purchases the certificate" do
16
+
17
+ DNSimple::Domain.expects(:find).with(domain_name).returns(domain)
18
+ DNSimple::Contact.expects(:find).with(contact_id).returns(contact)
19
+ DNSimple::Certificate.expects(:purchase).with(domain, name, contact).returns(stub("certificate", :fqdn => domain_name))
20
+
21
+ DNSimple::Commands::PurchaseCertificate.new(out).execute([domain_name, name, contact_id])
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+ require 'dnsimple/commands/submit_certificate'
3
+
4
+ describe DNSimple::Commands::SubmitCertificate do
5
+ let(:out) { StringIO.new }
6
+ let(:domain) { DNSimple::Domain.new(:name => domain_name) }
7
+ let(:domain_name) { 'example.com' }
8
+ let(:name) { 'www' }
9
+ let(:certificate) { DNSimple::Certificate.new(:id => certificate_id, :domain => domain) }
10
+ let(:certificate_id) { 1 }
11
+ let(:approver_email) { 'admin@example.com' }
12
+
13
+ it "submits the certificate" do
14
+ DNSimple::Domain.stubs(:find).with(domain_name).returns(domain)
15
+ DNSimple::Certificate.expects(:find).with(domain, certificate_id).returns(certificate)
16
+ certificate.expects(:submit).with(approver_email)
17
+ DNSimple::Commands::SubmitCertificate.new(out).execute([domain_name, certificate_id, approver_email])
18
+ end
19
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe DNSimple::Contact do
4
+
5
+ describe "a new contact" do
6
+ use_vcr_cassette
7
+
8
+ let(:contact_attributes) {
9
+ {
10
+ :first_name => 'John',
11
+ :last_name => 'Doe',
12
+ :address1 => '1 SW 1st Street',
13
+ :city => 'Miami',
14
+ :state_province => 'FL',
15
+ :postal_code => '33143',
16
+ :country => 'US',
17
+ :email_address => 'john.doe@example.com',
18
+ :phone => '305 111 2222'
19
+ }
20
+ }
21
+ it "has specific attributes" do
22
+ contact = DNSimple::Contact.create(contact_attributes)
23
+ contact.first_name.should eql(contact_attributes[:first_name])
24
+ contact.id.should_not be_nil
25
+ end
26
+ end
27
+
28
+ describe "an existing contact" do
29
+ use_vcr_cassette
30
+ it "can be found by id" do
31
+ contact = DNSimple::Contact.find(1)
32
+ contact.should_not be_nil
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ describe DNSimple::Domain do
4
+ let(:domain_name) { "example.com" }
5
+ let(:contact_id) { 1 }
6
+
7
+ describe "creating a new domain" do
8
+ use_vcr_cassette
9
+ it "has specific attributes" do
10
+ @domain = DNSimple::Domain.create(domain_name)
11
+ @domain.name.should eql(domain_name)
12
+ @domain.id.should_not be_nil
13
+ end
14
+ end
15
+ describe "finding an existing domain" do
16
+ context "by id" do
17
+ use_vcr_cassette
18
+ it "can be found" do
19
+ domain = DNSimple::Domain.find(39)
20
+ domain.name.should eql(domain_name)
21
+ domain.id.should_not be_nil
22
+ end
23
+ end
24
+ context "by name" do
25
+ use_vcr_cassette
26
+ it "can be found" do
27
+ domain = DNSimple::Domain.find(domain_name)
28
+ domain.name.should eql(domain_name)
29
+ domain.id.should_not be_nil
30
+ end
31
+ end
32
+ end
33
+
34
+ context "registration" do
35
+
36
+ context "with an existing contact" do
37
+ let(:domain_name) { "dnsimple-example-1321042237.com" }
38
+ use_vcr_cassette
39
+ it "can be registered" do
40
+ domain = DNSimple::Domain.register(domain_name, {:id => contact_id})
41
+ domain.name.should eql(domain_name)
42
+ end
43
+ end
44
+
45
+ context "with a new registrant contact" do
46
+ let(:domain_name) { "dnsimple-example-1321042288.com" }
47
+ use_vcr_cassette
48
+ it "can be registered" do
49
+ registrant = {
50
+ :first_name => 'John',
51
+ :last_name => 'Smith',
52
+ :address1 => '123 SW 1st Street',
53
+ :city => 'Miami',
54
+ :state_or_province => 'FL',
55
+ :country => 'US',
56
+ :postal_code => '33143',
57
+ :phone => '321 555 1212'
58
+ }
59
+ domain = DNSimple::Domain.register(domain_name, registrant)
60
+ domain.name.should eql(domain_name)
61
+ end
62
+ end
63
+ end
64
+
65
+ describe ".all" do
66
+ use_vcr_cassette
67
+ before do
68
+ @domains = []
69
+ 2.times do |n|
70
+ @domains << DNSimple::Domain.create("example#{n}.com")
71
+ end
72
+ end
73
+ it "returns a list of domains" do
74
+ domains = DNSimple::Domain.all
75
+ domains.map { |d| d.name }.should include(*@domains.map { |d| d.name })
76
+ end
77
+ end
78
+
79
+ describe "applying templates" do
80
+ use_vcr_cassette
81
+ let(:domain) { DNSimple::Domain.find("example.com") }
82
+ it "applies a named template" do
83
+ DNSimple::Record.all(domain).should be_empty
84
+ domain.apply("googleapps")
85
+ DNSimple::Record.all(domain).should_not be_empty
86
+ end
87
+ end
88
+
89
+ describe "setting name servers" do
90
+ use_vcr_cassette
91
+ let(:domain) { DNSimple::Domain.new(:name => 'example.com') }
92
+
93
+ it "overwrites name servers" do
94
+ domain.update_name_servers(["n1.fake.com", "ns2.fake.com"])
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe DNSimple::ExtendedAttribute do
4
+
5
+ describe "list extended attributes" do
6
+ context "for com" do
7
+ use_vcr_cassette
8
+ it "is an empty array" do
9
+ DNSimple::ExtendedAttribute.find('com').should be_empty
10
+ end
11
+ end
12
+ context "for ca" do
13
+ use_vcr_cassette
14
+ it "is not empty" do
15
+ DNSimple::ExtendedAttribute.find('ca').should_not be_empty
16
+ end
17
+ end
18
+ end
19
+ end