spec/lib/green-button-data/usage_point_spec.rb
require "spec_helper"
describe GreenButtonData::UsagePoint do
let(:all_url) { GreenButtonData.configuration.usage_point_url subscription_id: 5 }
let :find_url do
"#{all_url}2"
end
let(:token) { "53520584-d640-4812-a721-8a1afa459ff7" }
subject { GreenButtonData::UsagePoint }
let(:usage_point) { subject.find(2, subscription_id: 5, token: token) }
before do
GreenButtonData.configure do |config|
config.base_url = "https://services.greenbuttondata.org/DataCustodian/" +
"espi/1_1/resource"
config.subscription_path = "Subscription/"
config.usage_point_path = "UsagePoint/"
end
stub_request(:get, all_url).to_return status: 200, body: espi_usage_points
stub_request(:get, find_url).to_return status: 200, body: espi_usage_point
stub_request(
:get, "#{find_url}/"
).to_return status: 200, body: espi_usage_point
end
describe "Constructor" do
it "should be a valid instance of UsagePoint" do
usage_point = subject.new id: "1"
expect(usage_point).to be_a GreenButtonData::UsagePoint
expect(usage_point.id).to eq "1"
end
end
describe ".all" do
context "valid authorization" do
let(:collection) { subject.all(subscription_id: 5, token: token) }
it "should return a ModelCollection" do
expect(collection).to be_a GreenButtonData::ModelCollection
end
it "should be a collection of GreenButtonData::UsagePoint instances" do
expect(collection.first).to be_a GreenButtonData::UsagePoint
end
it "should populate attributes" do
expect(collection.first.id).to eq "1"
expect(collection.first.local_time_parameters_url).to eq "https://services.greenbuttondata.org//DataCustodian/espi/1_1/resource/LocalTimeParameters/1"
expect(collection.first.meter_reading_url).to eq "https://services.greenbuttondata.org//DataCustodian/espi/1_1/resource/Subscription/1/UsagePoint/1/MeterReading"
expect(collection.first.electric_power_usage_summary_url).to eq "https://services.greenbuttondata.org//DataCustodian/espi/1_1/resource/Subscription/1/UsagePoint/1/ElectricPowerUsageSummary"
expect(collection.first.service_category).to eq :electricity
end
end
end
describe ".find" do
context "valid authorization" do
it "is an instance of UsagePoint" do
expect(usage_point).to be_a GreenButtonData::UsagePoint
expect(WebMock).to have_requested(:get, "#{find_url}/")
end
it "should populate attributes" do
expect(usage_point.id).to eq "2"
expect(usage_point.local_time_parameters_url).to eq "https://services.greenbuttondata.org//DataCustodian/espi/1_1/resource/LocalTimeParameters/1"
expect(usage_point.meter_reading_url).to eq "https://services.greenbuttondata.org//DataCustodian/espi/1_1/resource/Subscription/5/UsagePoint/2/MeterReading"
expect(usage_point.electric_power_usage_summary_url).to eq "https://services.greenbuttondata.org//DataCustodian/espi/1_1/resource/Subscription/5/UsagePoint/2/ElectricPowerUsageSummary"
expect(usage_point.service_category).to eq :electricity
end
end
end
describe "relations" do
let :meter_readings_url do
"https://services.greenbuttondata.org//DataCustodian/espi/1_1/resource/Subscription/5/UsagePoint/2/MeterReading"
end
let :meter_reading_url do
"https://services.greenbuttondata.org//DataCustodian/espi/1_1/resource/Subscription/5/UsagePoint/2/MeterReading/1"
end
let :usage_summaries_url do
"https://services.greenbuttondata.org//DataCustodian/espi/1_1/resource/Subscription/5/UsagePoint/2/ElectricPowerUsageSummary"
end
let :usage_summary_url do
"https://services.greenbuttondata.org//DataCustodian/espi/1_1/resource/Subscription/5/UsagePoint/2/ElectricPowerUsageSummary/1"
end
let :interval_blocks_url do
"https://services.greenbuttondata.org//DataCustodian/espi/1_1/resource/Subscription/5/UsagePoint/2/MeterReading/1/IntervalBlock"
end
context "id of related resource is not specified" do
before do
stub_request(:get, meter_readings_url).
to_return status: 200, body: espi_usage_point_meter_readings
stub_request(:get, usage_summaries_url).
to_return status: 200, body: espi_usage_summaries
end
it "should lazy load all related resources" do
expect(usage_point.meter_readings).to be_a GreenButtonData::ModelCollection
expect(usage_point.meter_readings.size).to eq 1
expect(usage_point.meter_readings.first).to be_a GreenButtonData::MeterReading
expect(usage_point.meter_readings.first.id).to eq "1"
expect(a_request(:get, meter_readings_url)).to have_been_made.once
expect(usage_point.usage_summaries).to be_a GreenButtonData::ModelCollection
expect(usage_point.usage_summaries.first).to be_a GreenButtonData::UsageSummary
expect(usage_point.usage_summaries.first.id).to eq "1"
expect(a_request(:get, usage_summaries_url)).to have_been_made.once
end
it "should use cached results on subsequent calls" do
meter_readings = usage_point.meter_readings
usage_summaries = usage_point.usage_summaries
cached_meter_readings = usage_point.meter_readings
cached_usage_summaries = usage_point.usage_summaries
expect(meter_readings).to eq cached_meter_readings
expect(usage_summaries).to eq cached_usage_summaries
expect(a_request(:get, meter_readings_url)).to have_been_made.once
expect(a_request(:get, usage_summaries_url)).to have_been_made.once
end
end
context "id of related resource is specified" do
before do
stub_request(:get, meter_reading_url).
to_return status: 200, body: espi_usage_point_meter_reading
stub_request(:get, interval_blocks_url).
to_return status: 200, body: espi_interval_block
stub_request(:get, usage_summary_url).
to_return status: 200, body: espi_usage_summary
end
it "should lazy load a related resource that matches id" do
expect(usage_point.meter_readings(1)).to be_a GreenButtonData::MeterReading
expect(WebMock).to have_requested :get, meter_reading_url
expect(usage_point.meter_readings.size).to eq 1
expect(usage_point.meter_readings.first).to be_a GreenButtonData::MeterReading
expect(usage_point.meter_readings.first.id).to eq "1"
expect(usage_point.usage_summaries(1)).to be_a GreenButtonData::UsageSummary
expect(WebMock).to have_requested :get, usage_summary_url
expect(usage_point.usage_summaries.size).to eq 1
expect(usage_point.usage_summaries.first).to be_a GreenButtonData::UsageSummary
expect(usage_point.usage_summaries.first.id).to eq "1"
end
it "should use cached results on subsequent calls" do
expect(usage_point.meter_readings(1)).to be_a GreenButtonData::MeterReading
expect(usage_point.meter_readings(1)).to be_a GreenButtonData::MeterReading
expect(a_request(:get, meter_reading_url)).to have_been_made.once
end
it "should lazy load a related resource two levels deep" do
expect(usage_point.meter_readings(1).interval_blocks).to be_a GreenButtonData::ModelCollection
expect(usage_point.meter_readings(1).interval_blocks.first).to be_a GreenButtonData::IntervalBlock
end
end
end
end