Skip to content

Commit

Permalink
✅ Adds support for Device Roles
Browse files Browse the repository at this point in the history
  • Loading branch information
cimnine committed May 4, 2017
1 parent c326572 commit e3cee19
Show file tree
Hide file tree
Showing 8 changed files with 255 additions and 4 deletions.
8 changes: 6 additions & 2 deletions lib/netbox_client_ruby/api/dcim.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
require 'netbox_client_ruby/api/dcim/device_role'
require 'netbox_client_ruby/api/dcim/device_roles'
require 'netbox_client_ruby/api/dcim/device_type'
require 'netbox_client_ruby/api/dcim/device_types'
require 'netbox_client_ruby/api/dcim/manufacturer'
Expand All @@ -14,7 +16,8 @@ class DCIM
sites: Sites,
regions: Regions,
manufacturers: Manufacturers,
device_types: DeviceTypes
device_types: DeviceTypes,
device_roles: DeviceRoles,
}.each_pair do |method_name, class_name|
define_method(method_name) do
class_name.new
Expand All @@ -25,7 +28,8 @@ class DCIM
site: Site,
region: Region,
manufacturer: Manufacturer,
device_type: DeviceType
device_type: DeviceType,
device_role: DeviceRole,
}.each_pair do |method_name, class_name|
define_method(method_name) do |id|
class_name.new id
Expand Down
14 changes: 14 additions & 0 deletions lib/netbox_client_ruby/api/dcim/device_role.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
require 'netbox_client_ruby/entity'
require 'netbox_client_ruby/api/dcim/manufacturer'

module NetboxClientRuby
class DeviceRole
include NetboxClientRuby::Entity

id id: :id
deletable true
path 'dcim/device-roles/:id.json'
creation_path 'dcim/device-roles/'

end
end
19 changes: 19 additions & 0 deletions lib/netbox_client_ruby/api/dcim/device_roles.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
require 'netbox_client_ruby/entities'
require 'netbox_client_ruby/api/dcim/device_type'

module NetboxClientRuby
class DeviceRoles
include NetboxClientRuby::Entities

path 'dcim/device-roles.json'
data_key 'results'
count_key 'count'
entity_creator :entity_creator

private

def entity_creator(raw_entity)
NetboxClientRuby::DeviceRole.new raw_entity['id']
end
end
end
6 changes: 6 additions & 0 deletions spec/fixtures/dcim/device-role_1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"id": 1,
"name": "devicerole1",
"slug": "devicerole1",
"color": "aa1409"
}
13 changes: 13 additions & 0 deletions spec/fixtures/dcim/device-roles.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": "devicerole1",
"slug": "devicerole1",
"color": "aa1409"
}
]
}
136 changes: 136 additions & 0 deletions spec/netbox_client_ruby/api/dcim/device_role_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
require 'spec_helper'

describe NetboxClientRuby::DeviceRole, faraday_stub: true do
let(:entity_id) { 1 }
let(:expected_name) { 'devicerole1' }
let(:sut) { NetboxClientRuby::DeviceRole }
let(:base_url) { '/api/dcim/device-roles/' }

let(:request_url) { "#{base_url}#{entity_id}.json" }
let(:response) { File.read("spec/fixtures/dcim/device-role_#{entity_id}.json") }

subject { sut.new entity_id }

describe '#id' do
it 'shall be the expected id' do
expect(subject.id).to eq(entity_id)
end
end

describe '#name' do
it 'should fetch the data' do
expect(faraday).to receive(:get).and_call_original

expect(subject.name).to_not be_nil
end

it 'shall be the expected name' do
expect(subject.name).to eq(expected_name)
end
end

describe '.delete' do
let(:request_method) { :delete }
let(:response_status) { 204 }
let(:response) { nil }

it 'should delete the object' do
expect(faraday).to receive(request_method).and_call_original
subject.delete
end
end

describe '.update' do
let(:request_method) { :patch }
let(:request_params) { { 'name' => 'noob' } }

it 'should update the object' do
expect(faraday).to receive(request_method).and_call_original
expect(subject.update(name: 'noob').name).to eq(expected_name)
end
end

describe '.reload' do
it 'should reload the object' do
expect(faraday).to receive(request_method).twice.and_call_original

subject.reload
subject.reload
end
end

describe '.save' do
let(:name) { 'foobar' }
let(:slug) { name }
let(:request_params) { { 'name' => name, 'slug' => slug } }

context 'update' do
let(:request_method) { :patch }

subject do
region = sut.new entity_id
region.name = name
region.slug = slug
region
end

it 'does not call PATCH until save is called' do
expect(faraday).to_not receive(request_method)
expect(faraday).to_not receive(:get)

expect(subject.name).to eq(name)
expect(subject.slug).to eq(slug)
end

it 'calls PATCH when save is called' do
expect(faraday).to receive(request_method).and_call_original

expect(subject.save).to be(subject)
end

it 'Reads the anwer from the PATCH answer' do
expect(faraday).to receive(request_method).and_call_original

subject.save
expect(subject.name).to eq(expected_name)
expect(subject.slug).to eq(expected_name)
end
end

context 'create' do
let(:request_method) { :post }
let(:request_url) { base_url }

subject do
region = sut.new
region.name = name
region.slug = slug
region
end

it 'does not POST until save is called' do
expect(faraday).to_not receive(request_method)
expect(faraday).to_not receive(:get)

expect(subject.name).to eq(name)
expect(subject.slug).to eq(slug)
end

it 'POSTs the data upon a call of save' do
expect(faraday).to receive(request_method).and_call_original

expect(subject.save).to be(subject)
end

it 'Reads the answer from the POST' do
expect(faraday).to receive(request_method).and_call_original

subject.save

expect(subject.id).to be(1)
expect(subject.name).to eq(expected_name)
expect(subject.slug).to eq(expected_name)
end
end
end
end
57 changes: 57 additions & 0 deletions spec/netbox_client_ruby/api/dcim/device_roles_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
require 'spec_helper'

describe NetboxClientRuby::DeviceRoles, faraday_stub: true do
let(:expected_length) { 1 }
let(:singular_type) { NetboxClientRuby::DeviceRole }

let(:response) { File.read('spec/fixtures/dcim/device-roles.json') }
let(:request_url) { '/api/dcim/device-roles.json' }
let(:request_url_params) do
{ limit: NetboxClientRuby.config.netbox.pagination.default_limit }
end

context 'unpaged fetch' do
describe '#length' do
it 'shall be the expected length' do
expect(subject.length).to be expected_length
end
end

describe '#total' do
it 'shall be the expected total' do
expect(subject.total).to be expected_length
end
end
end

describe '#reload' do
it 'fetches the correct data' do
expect(faraday).to receive(:get).and_call_original
subject.reload
end

it 'caches the data' do
expect(faraday).to receive(:get).and_call_original
subject.total
subject.total
end

it 'reloads the data' do
expect(faraday).to receive(:get).twice.and_call_original
subject.reload
subject.reload
end
end

describe '#as_array' do
it 'return the correct amount' do
expect(subject.as_array.length).to be expected_length
end

it 'returns Site instances' do
subject.as_array.each do |element|
expect(element).to be_a singular_type
end
end
end
end
6 changes: 4 additions & 2 deletions spec/netbox_client_ruby/api/dcim_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
sites: NetboxClientRuby::Sites,
regions: NetboxClientRuby::Regions,
manufacturers: NetboxClientRuby::Manufacturers,
device_types: NetboxClientRuby::DeviceTypes
device_types: NetboxClientRuby::DeviceTypes,
device_roles: NetboxClientRuby::DeviceRoles,
}.each do |method, expected_class|
describe ".#{method}" do
subject { NetboxClientRuby::DCIM.new.public_send(method) }
Expand All @@ -31,7 +32,8 @@
site: NetboxClientRuby::Site,
region: NetboxClientRuby::Region,
manufacturer: NetboxClientRuby::Manufacturer,
device_type: NetboxClientRuby::DeviceType
device_type: NetboxClientRuby::DeviceType,
device_role: NetboxClientRuby::DeviceRole,
}.each do |method, expected_class|
describe ".#{method}" do
let(:id) { 1 }
Expand Down

0 comments on commit e3cee19

Please sign in to comment.