Skip to content

Commit 4d629ff

Browse files
committed
More specs for query options.
1 parent be4760c commit 4d629ff

File tree

4 files changed

+69
-43
lines changed

4 files changed

+69
-43
lines changed

lib/tenkit/client.rb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,7 @@ def weather_alert(id, language: 'en')
5353
def get(url, query: nil)
5454
headers = { Authorization: "Bearer #{token}" }
5555
params = { headers: headers }
56-
57-
if !query.nil?
58-
params[:query] = query
59-
end
60-
56+
params[:query] = query unless query.nil?
6157
self.class.get(url, params)
6258
end
6359

lib/tenkit/utils.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,11 @@ def self.snake(str)
55

66
str.gsub(/(.)([A-Z])/, '\1_\2').sub(/_UR_L$/, "_URL").downcase
77
end
8+
9+
def self.camel(str)
10+
return str.camelize(:lower) if str.respond_to? :camelize
11+
12+
str.gsub(/_(.)/) {|e| $1.upcase}
13+
end
814
end
915
end

spec/tenkit/tenkit/utils_spec.rb

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
require_relative "../spec_helper"
22
RSpec.describe Tenkit::Utils do
3+
let(:camel) { "someSpecialCaseString" }
4+
let(:snake) { "some_special_case_string" }
5+
36
subject { Tenkit::Utils }
47

58
describe ".snake" do
6-
let(:simple) { "someCamelCaseString" }
7-
let(:correct) { "some_camel_case_string" }
89
let(:complex) { "someAWSCredentials" }
910
let(:mangled) { "some_aw_scredentials" }
1011

1112
it "converts to snake case" do
12-
expect(subject.snake(simple)).to eq correct
13+
expect(subject.snake(camel)).to eq snake
1314
end
1415

1516
context "when passed an acronym" do
@@ -26,10 +27,28 @@
2627
end
2728
end
2829
end
30+
31+
describe ".camel" do
32+
it "converts to camel case" do
33+
expect(subject.camel(snake)).to eq camel
34+
end
35+
36+
context "when a proper camelize package is available" do
37+
let(:patched_string) { PatchedString.new snake }
38+
39+
it "uses string camelize method" do
40+
expect(subject.camel(patched_string)).to eq :correct
41+
end
42+
end
43+
end
2944
end
3045

3146
class PatchedString < String
3247
def underscore
3348
:correct
3449
end
50+
51+
def camelize(sym)
52+
:correct
53+
end
3554
end

spec/tenkit/tenkit/weather_spec.rb

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,48 +4,59 @@
44
let(:lat) { 37.32 }
55
let(:lon) { 122.03 }
66
let(:path) { "/weather/en/#{lat}/#{lon}" }
7-
let(:data_sets) { [Tenkit::Utils.snake(data_set).to_sym] }
8-
let(:query) { {query: {dataSets: data_set}} }
9-
7+
let(:params) { {dataSets: data_set} }
108
let(:client) { Tenkit::Client.new }
11-
let(:api_response) { double("WeatherResponse", body: json) }
129
let(:json) { File.read("test/fixtures/#{data_set}.json") }
10+
let(:resp) { double("WeatherResponse", body: json) }
11+
let(:data_sets) { [Tenkit::Utils.snake(data_set).to_sym] }
1312

14-
before { allow(client).to receive(:get).and_return(api_response) }
13+
before { expect(client).to receive(:get).with(path, {query: params}).and_return(resp) }
1514

1615
describe "currentWeather" do
1716
let(:data_set) { "currentWeather" }
1817

19-
subject { client.weather(lat, lon, data_sets: data_sets).weather.current_weather }
18+
context "with options" do
19+
let(:fmt) { "%FT%TZ" }
20+
let(:now) { Time.now }
21+
let(:options) do
22+
{country_code: "US",
23+
current_as_of: now.strftime(fmt),
24+
daily_end: (now + 12 * 3600).strftime(fmt),
25+
daily_start: (now - 12 * 3600).strftime(fmt),
26+
data_sets: data_sets,
27+
hourly_end: (now + 6 * 3600).strftime(fmt),
28+
hourly_start: (now - 6 * 3600).strftime(fmt),
29+
timezone: "PST"}
30+
end
31+
let(:params) do
32+
options.map { |k, v| [Tenkit::Utils.camel(k.to_s).to_sym, (k == :data_sets) ? data_set : v] }.to_h
33+
end
2034

21-
it "returns response from correct data_sets" do
22-
subject
23-
expect(client).to have_received(:get).with(path, query)
24-
end
35+
subject { client.weather(lat, lon, **options).weather.current_weather }
2536

26-
it "includes expected metadata" do
27-
expect(subject.name).to eq "CurrentWeather"
28-
expect(subject.metadata.attribution_url).to start_with 'https://'
29-
expect(subject.metadata.latitude).to be 37.32
30-
expect(subject.metadata.longitude).to be 122.03
31-
end
37+
it "includes expected metadata" do
38+
expect(subject.name).to eq "CurrentWeather"
39+
expect(subject.metadata.attribution_url).to start_with "https://"
40+
expect(subject.metadata.latitude).to be 37.32
41+
expect(subject.metadata.longitude).to be 122.03
42+
end
3243

33-
it "returns correct object types" do
34-
expect(subject).to be_a Tenkit::CurrentWeather
35-
expect(subject.metadata).to be_a Tenkit::Metadata
36-
end
44+
it "returns correct object types" do
45+
expect(subject).to be_a Tenkit::CurrentWeather
46+
expect(subject.metadata).to be_a Tenkit::Metadata
47+
end
3748

38-
it "returns current weather data" do
39-
expect(subject.temperature).to be(-5.68)
40-
expect(subject.temperature_apparent).to be(-6.88)
49+
it "returns current weather data" do
50+
expect(subject.temperature).to be(-5.68)
51+
expect(subject.temperature_apparent).to be(-6.88)
52+
end
4153
end
4254

4355
context "without options" do
4456
subject { client.weather(lat, lon).weather.current_weather }
4557

46-
it "returns response from default currentWeather data set" do
58+
it "returns response" do
4759
expect(subject.name).to eq "CurrentWeather"
48-
expect(client).to have_received(:get).with(path, query)
4960
end
5061
end
5162
end
@@ -56,9 +67,8 @@
5667

5768
subject { client.weather(lat, lon, data_sets: data_sets).weather.forecast_daily }
5869

59-
it "returns 10 days of data from correct data sets" do
70+
it "returns 10 days of data" do
6071
expect(subject.days.size).to be 10
61-
expect(client).to have_received(:get).with(path, query)
6272
end
6373

6474
it "returns correct object types" do
@@ -69,13 +79,9 @@
6979
expect(first_day.rest_of_day_forecast).to be_a Tenkit::RestOfDayForecast
7080
end
7181

72-
it "excludes learn_more_url node" do
73-
expect(subject.respond_to? :learn_more_url).to be false
74-
end
75-
7682
it "includes expected metadata" do
7783
expect(subject.name).to eq "DailyForecast"
78-
expect(subject.metadata.attribution_url).to start_with 'https://'
84+
expect(subject.metadata.attribution_url).to start_with "https://"
7985
expect(subject.metadata.latitude).to be 37.32
8086
expect(subject.metadata.longitude).to be 122.03
8187
end
@@ -101,14 +107,13 @@
101107

102108
subject { client.weather(lat, lon, data_sets: data_sets).weather.forecast_hourly }
103109

104-
it "returns 25 hours of data from correct data sets" do
110+
it "returns 25 hours of data" do
105111
expect(subject.hours.size).to be 25
106-
expect(client).to have_received(:get).with(path, query)
107112
end
108113

109114
it "includes expected metadata" do
110115
expect(subject.name).to eq "HourlyForecast"
111-
expect(subject.metadata.attribution_url).to start_with 'https://'
116+
expect(subject.metadata.attribution_url).to start_with "https://"
112117
expect(subject.metadata.latitude).to be 37.32
113118
expect(subject.metadata.longitude).to be 122.03
114119
end

0 commit comments

Comments
 (0)