Skip to content

Commit

Permalink
Merge 34803b4 into d8bac8e
Browse files Browse the repository at this point in the history
  • Loading branch information
weppos committed Jan 7, 2016
2 parents d8bac8e + 34803b4 commit fa36748
Show file tree
Hide file tree
Showing 12 changed files with 351 additions and 23 deletions.
12 changes: 12 additions & 0 deletions lib/dnsimple/client/clients.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ def misc
@services[:misc] ||= Client::MiscService.new(self)
end

# @return [Dnsimple::Client::ZonesService] The zone-related API proxy.
def zones
@services[:zones] ||= Client::ZonesService.new(self)
end


class ClientService < ::Struct.new(:client)

Expand Down Expand Up @@ -56,5 +61,12 @@ class MiscService < ClientService
include Client::Misc
end


require_relative 'zones_records'

class ZonesService < ClientService
include Client::ZonesRecords
end

end
end
18 changes: 10 additions & 8 deletions lib/dnsimple/client/domains.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@ module Domains
# @see #all_domains
#
# @example List domains in the first page
# client.domains(1010)
# client.domains.list(1010)
#
# @example List domains, provide a specific page
# client.domains(1010, query: { page: 2 })
# client.domains.list(1010, query: { page: 2 })
#
# @param [Fixnum] account_id the account ID
# @param [Hash] options the filtering and sorting option
# @return [Dnsimple::PaginatedResponse<Dnsimple::Struct::Domain>]
#
# @raise [Dnsimple::RequestError]
def domains(account_id, options = {})
response = client.get(Client.versioned("/%s/domains" % [account_id]), options)
Expand All @@ -39,6 +40,7 @@ def domains(account_id, options = {})
# @param [Fixnum] account_id the account ID
# @param [Hash] options the filtering and sorting option
# @return [Dnsimple::CollectionResponse<Dnsimple::Struct::Domain>]
#
# @raise [Dnsimple::RequestError]
def all_domains(account_id, options = {})
paginate(:domains, account_id, options)
Expand Down Expand Up @@ -69,14 +71,14 @@ def create_domain(account_id, attributes = {}, options = {})
# @see https://developer.dnsimple.com/v2/domains/#get
#
# @param [Fixnum] account_id the account ID
# @param [#to_s] domain The domain id or domain name.
# @param [#to_s] domain_id The domain id or domain name.
# @param [Hash] options
# @return [Dnsimple::Response<Dnsimple::Struct::Domain>]
#
# @raise [Dnsimple::NotFoundError]
# @raise [Dnsimple::RequestError]
def domain(account_id, domain, options = {})
response = client.get(Client.versioned("/%s/domains/%s" % [account_id, domain]), options)
def domain(account_id, domain_id, options = {})
response = client.get(Client.versioned("/%s/domains/%s" % [account_id, domain_id]), options)

Dnsimple::Response.new(response, Struct::Domain.new(response["data"]))
end
Expand All @@ -88,14 +90,14 @@ def domain(account_id, domain, options = {})
# @see https://developer.dnsimple.com/v2/domains/#delete
#
# @param [Fixnum] account_id the account ID
# @param [#to_s] domain The domain id or domain name.
# @param [#to_s] domain_id The domain id or domain name.
# @param [Hash] options
# @return [Dnsimple::Response<nil>]
#
# @raise [Dnsimple::NotFoundError]
# @raise [Dnsimple::RequestError]
def delete_domain(account_id, domain, options = {})
response = client.delete(Client.versioned("/%s/domains/%s" % [account_id, domain]), options)
def delete_domain(account_id, domain_id, options = {})
response = client.delete(Client.versioned("/%s/domains/%s" % [account_id, domain_id]), options)

Dnsimple::Response.new(response, nil)
end
Expand Down
70 changes: 70 additions & 0 deletions lib/dnsimple/client/zones_records.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
module Dnsimple
class Client
module ZonesRecords

# Lists the zone records in the account.
#
# @see https://developer.dnsimple.com/v2/zones/records/#list
# @see #all_records
#
# @example List records for the zone "example.com" in the first page
# client.zones.records(1010, "example.com")
#
# @example List records for the zone "example.com", provide a specific page
# client.zones.records(1010, "example.com", query: { page: 2 })
#
# @param [Fixnum, Dnsimple::Client::WILDCARD_ACCOUNT] account_id the account ID or wildcard
# @param [String] zone_id the zone name
# @param [Hash] options the filtering and sorting option
# @return [Dnsimple::PaginatedResponse<Dnsimple::Struct::Record>]
#
# @raise [Dnsimple::RequestError]
def records(account_id, zone_id, options = {})
response = client.get(Client.versioned("/%s/zones/%s/records" % [account_id, zone_id]), options)

Dnsimple::PaginatedResponse.new(response, response["data"].map { |r| Struct::Record.new(r) })
end
alias :list_records :records

# Lists ALL the zone records in the account.
#
# This method is similar to {#records}, but instead of returning the results of a specific page
# it iterates all the pages and returns the entire collection.
#
# Please use this method carefully, as fetching the entire collection will increase the number of requests
# you send to the API server and you may eventually risk to hit the throttle limit.
#
# @see https://developer.dnsimple.com/v2/zones/records/#list
# @see #records
#
# @param [Fixnum, Dnsimple::Client::WILDCARD_ACCOUNT] account_id the account ID or wildcard
# @param [String] zone_id the zone name
# @param [Hash] options the filtering and sorting option
# @return [Dnsimple::CollectionResponse<Dnsimple::Struct::Record>]
#
# @raise [Dnsimple::RequestError]
def all_records(account_id, zone_id, options = {})
paginate(:records, account_id, zone_id, options)
end

# Gets a zone record from the account.
#
# @see https://developer.dnsimple.com/v2/zones/records/#get
#
# @param [Fixnum, Dnsimple::Client::WILDCARD_ACCOUNT] account_id the account ID or wildcard
# @param [String] zone_id the zone name
# @param [Fixnum] record_id the record ID
# @param [Hash] options
# @return [Dnsimple::Response<Dnsimple::Struct::Domain>]
#
# @raise [Dnsimple::NotFoundError]
# @raise [Dnsimple::RequestError]
def record(account_id, zone_id, record_id, options = {})
response = client.get(Client.versioned("/%s/zones/%s/records/%s" % [account_id, zone_id, record_id]), options)

Dnsimple::Response.new(response, Struct::Record.new(response["data"]))
end

end
end
end
1 change: 1 addition & 0 deletions lib/dnsimple/struct.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@ def initialize(attributes = {})

require_relative 'struct/account'
require_relative 'struct/domain'
require_relative 'struct/record'
require_relative 'struct/user'
40 changes: 40 additions & 0 deletions lib/dnsimple/struct/record.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
module Dnsimple
module Struct

class Record < Base
# @return [Fixnum] The record ID in DNSimple.
attr_accessor :id

# @return [Fixnum] The associated domain ID.
attr_accessor :domain_id

# @return [Fixnum] The ID of the parent record, if this record is dependent on another record.
attr_accessor :parent_id

# @return [String] The type of record, in uppercase.
attr_accessor :type

# @return [String] The record name (without the domain name).
attr_accessor :name

# @return [String] The plain-text record content.
attr_accessor :content

# @return [Fixnum] The TTL value.
attr_accessor :ttl

# @return [Fixnum] The priority value, if the type of record accepts a priority.
attr_accessor :priority

# @return [Bool] True if this is a system record created by DNSimple. System records are read-only.
attr_accessor :system_record

# @return [String] When the domain was created in DNSimple.
attr_accessor :created_at

# @return [String] When the domain was last updated in DNSimple.
attr_accessor :updated_at
end

end
end
14 changes: 10 additions & 4 deletions spec/dnsimple/client/domains_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@
expect(WebMock).to have_requested(:get, "https://api.dnsimple.test/v2/#{account_id}/domains?page=2")
end

it "supports extra request options" do
subject.domains(account_id, query: { foo: "bar" })

expect(WebMock).to have_requested(:get, "https://api.dnsimple.test/v2/#{account_id}/domains?foo=bar")
end

it "returns the domains" do
response = subject.domains(account_id)

Expand Down Expand Up @@ -120,10 +126,10 @@
expect(result.updated_at).to eq("2015-12-09T00:20:56.056Z")
end

context "when something does not exist" do
context "when the domain does not exist" do
it "raises NotFoundError" do
stub_request(:get, %r[/v2])
.to_return(read_fixture("domains/notfound-domain.http"))
.to_return(read_fixture("notfound-domain.http"))

expect {
subject.domain(account_id, "example.com")
Expand Down Expand Up @@ -155,10 +161,10 @@
expect(result).to be_nil
end

context "when something does not exist" do
context "when the domain does not exist" do
it "raises NotFoundError" do
stub_request(:delete, %r[/v2])
.to_return(read_fixture("domains/notfound-domain.http"))
.to_return(read_fixture("notfound-domain.http"))

expect {
subject.delete_domain(account_id, "example.com")
Expand Down
139 changes: 139 additions & 0 deletions spec/dnsimple/client/zones_records_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
require 'spec_helper'

describe Dnsimple::Client, ".zones" do

subject { described_class.new(api_endpoint: "https://api.dnsimple.test", access_token: "a1b2c3").zones }


describe "#records" do
let(:account_id) { 1010 }
let(:zone_id) { "example.com" }

before do
stub_request(:get, %r[/v2/#{account_id}/zones/#{zone_id}/records])
.to_return(read_fixture("zones/records/success.http"))
end

it "builds the correct request" do
subject.records(account_id, zone_id)

expect(WebMock).to have_requested(:get, "https://api.dnsimple.test/v2/#{account_id}/zones/#{zone_id}/records")
.with(headers: { 'Accept' => 'application/json' })
end

it "supports pagination" do
subject.records(account_id, zone_id, query: { page: 2 })

expect(WebMock).to have_requested(:get, "https://api.dnsimple.test/v2/#{account_id}/zones/#{zone_id}/records?page=2")
end

it "supports extra request options" do
subject.records(account_id, zone_id, query: { foo: "bar" })

expect(WebMock).to have_requested(:get, "https://api.dnsimple.test/v2/#{account_id}/zones/#{zone_id}/records?foo=bar")
end

it "returns the records" do
response = subject.records(account_id, zone_id)

expect(response).to be_a(Dnsimple::PaginatedResponse)
expect(response.data).to be_a(Array)
expect(response.data.size).to eq(5)

response.data.each do |result|
expect(result).to be_a(Dnsimple::Struct::Record)
expect(result.id).to be_a(Fixnum)
end
end

it "exposes the pagination information" do
response = subject.records(account_id, zone_id)

expect(response.respond_to?(:page)).to be_truthy
expect(response.page).to eq(1)
expect(response.per_page).to be_a(Fixnum)
expect(response.total_entries).to be_a(Fixnum)
expect(response.total_pages).to be_a(Fixnum)
end

# context "when the zone does not exist" do
# it "raises NotFoundError" do
# stub_request(:get, %r[/v2])
# .to_return(read_fixture("notfound-zone.http"))
#
# expect {
# subject.domain(account_id, zone_id)
# }.to raise_error(Dnsimple::NotFoundError)
# end
# end
end

describe "#all_records" do
let(:account_id) { 1010 }
let(:zone_id) { "example.com" }

it "delegates to client.paginate" do
expect(subject).to receive(:paginate).with(:records, account_id, zone_id, { foo: "bar" })
subject.all_records(account_id, zone_id, { foo: "bar" })
end
end

describe "#record" do
let(:account_id) { 1010 }
let(:zone_id) { "example.com" }

before do
stub_request(:get, %r[/v2/#{account_id}/zones/#{zone_id}/records/.+$])
.to_return(read_fixture("zones/record/success.http"))
end

it "builds the correct request" do
subject.record(account_id, zone_id, record = "3")

expect(WebMock).to have_requested(:get, "https://api.dnsimple.test/v2/#{account_id}/zones/#{zone_id}/records/#{record}")
.with(headers: { 'Accept' => 'application/json' })
end

it "returns the record" do
response = subject.record(account_id, zone_id, "3")
expect(response).to be_a(Dnsimple::Response)

result = response.data
expect(result).to be_a(Dnsimple::Struct::Record)
expect(result.id).to eq(64779)
expect(result.domain_id).to eq(5841)
expect(result.parent_id).to eq(nil)
expect(result.type).to eq("SOA")
expect(result.name).to eq("")
expect(result.content).to eq("ns1.dnsimple.com admin.dnsimple.com 1452184205 86400 7200 604800 300")
expect(result.ttl).to eq(3600)
expect(result.priority).to eq(nil)
expect(result.system_record).to eq(true)
expect(result.created_at).to eq("2016-01-07T16:30:05.379Z")
expect(result.updated_at).to eq("2016-01-07T16:30:05.379Z")
end

# context "when the zone does not exist" do
# it "raises NotFoundError" do
# stub_request(:get, %r[/v2])
# .to_return(read_fixture("notfound-zone.http"))
#
# expect {
# subject.domain(account_id, zone_id, "0")
# }.to raise_error(Dnsimple::NotFoundError)
# end
# end

# context "when the record does not exist" do
# it "raises NotFoundError" do
# stub_request(:get, %r[/v2])
# .to_return(read_fixture("notfound-record.http"))
#
# expect {
# subject.domain(account_id, zone_id, "0")
# }.to raise_error(Dnsimple::NotFoundError)
# end
# end
end

end
Loading

0 comments on commit fa36748

Please sign in to comment.