Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: unit tests

on: [push, pull_request]
on: [push]

jobs:
test:
Expand Down
17 changes: 17 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
inherit_from: .rubocop_todo.yml

require:
- rubocop-capybara
- rubocop-rake
- rubocop-rspec

AllCops:
NewCops: enable

Expand All @@ -11,6 +16,10 @@ Metrics/BlockLength:
Exclude:
- spec/**/*

Metrics/ClassLength:
Exclude:
- src/alexa_processor.rb

Metrics/CyclomaticComplexity:
Exclude:
- spec/**/*
Expand All @@ -26,5 +35,13 @@ Metrics/PerceivedComplexity:
Naming/MethodParameterName:
Enabled: false

RSpec/ExampleLength:
Exclude:
- spec/**/*

RSpec/MultipleExpectations:
Exclude:
- spec/**/*

Style/FormatStringToken:
Enabled: false
3 changes: 3 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ end

group :development do
gem 'rubocop'
gem 'rubocop-capybara'
gem 'rubocop-rake'
gem 'rubocop-rspec'
end

group :test do
Expand Down
12 changes: 12 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ GEM
language_server-protocol (3.17.0.3)
matrix (0.4.2)
mini_mime (1.1.5)
nokogiri (1.15.5-arm64-darwin)
racc (~> 1.4)
nokogiri (1.15.5-x64-mingw-ucrt)
racc (~> 1.4)
nokogiri (1.15.5-x86_64-darwin)
Expand Down Expand Up @@ -68,6 +70,12 @@ GEM
unicode-display_width (>= 2.4.0, < 3.0)
rubocop-ast (1.30.0)
parser (>= 3.2.1.0)
rubocop-capybara (2.21.0)
rubocop (~> 1.41)
rubocop-rake (0.6.0)
rubocop (~> 1.0)
rubocop-rspec (3.0.0)
rubocop (~> 1.40)
ruby-progressbar (1.13.0)
rubyzip (2.3.2)
selenium-webdriver (4.10.0)
Expand Down Expand Up @@ -95,6 +103,7 @@ GEM
nokogiri (~> 1.8)

PLATFORMS
arm64-darwin-23
x64-mingw-ucrt
x86_64-darwin-21
x86_64-linux
Expand All @@ -107,6 +116,9 @@ DEPENDENCIES
rake
rspec
rubocop
rubocop-capybara
rubocop-rake
rubocop-rspec
selenium-webdriver
simplecov
vcr
Expand Down
17 changes: 15 additions & 2 deletions database/city_map.json
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,18 @@
"contact":{"phone": "(763) 555-1212"}
}
,
"frostbitefails":
{"site":"http://www2.minneapolismn.gov/snow/index.htm",
"yesCondition": ["about"],
"noCondition": ["a snow emergency is currently not in effect"],
"policy": "The city declares snow emergencies for major snow events of three inches or more. During a snow emergency, you must park your vehicle off the street to avoid ticketing and towing until the street is plowed to the curb.",
"tow":true,
"notify":{},
"threshold":"3",
"text":"",
"contact":{"phone": "(763) 555-1212"}
}
,
"mankato":
{"site":"https://www.mankatomn.gov/city-services-a-z/city-services-n-z/snow-and-ice-control",
"yesCondition": [],
Expand Down Expand Up @@ -230,10 +242,11 @@
}
,
"minneapolis":
{"site":"https://www.minneapolismn.gov/",
{"site":"https://www.minneapolismn.gov/media/minneapolismngov/site-assets/javascript/site-wide-notices/emergency-en.json",
"yesCondition": ["declared a snow emergency",
"snow emergency declared",
"snow emergency has been declared"],
"snow emergency has been declared",
"rules are in effect"],
"noCondition": ["not a snow emergency",
"no snow emergency"],
"policy": "Snow Emergencies are called after significant snowfall and before 6 p.m. on any given day. During a Snow Emergency, special parking rules go into effect that allow City crews to plow streets and emergency vehicles to travel safely.",
Expand Down
28 changes: 14 additions & 14 deletions spec/alexa_device_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,29 @@
require_relative 'spec_helper'

RSpec.describe AlexaDevice do
context '#pick_font_size' do
describe '#pick_font_size' do
it 'handles round' do
ad = AlexaDevice.new JSON.parse(slug_hub_json(480, 480))
ad = described_class.new JSON.parse(slug_hub_json(480, 480))
expect(ad.pick_font_size).to eq('170dp')
end

it 'handles small' do
ad = AlexaDevice.new JSON.parse(slug_hub_json(480, 960))
ad = described_class.new JSON.parse(slug_hub_json(480, 960))
expect(ad.pick_font_size).to eq('30dp')
end

it 'handles exlarge' do
ad = AlexaDevice.new JSON.parse(slug_hub_json(800, 1200))
ad = described_class.new JSON.parse(slug_hub_json(800, 1200))
expect(ad.pick_font_size).to eq('50dp')
end

it 'provides default when no match' do
ad = AlexaDevice.new JSON.parse(slug_hub_json(1, 1))
ad = described_class.new JSON.parse(slug_hub_json(1, 1))
expect(ad.pick_font_size).to eq('40dp')
end

it 'provides default when nil inputs' do
ad = AlexaDevice.new JSON.parse(slug_hub_json(1, 1))
ad = described_class.new JSON.parse(slug_hub_json(1, 1))
ad.instance_variable_set(:@height, nil)
ad.instance_variable_set(:@width, nil)
expect(ad.pick_font_size).to eq('40dp')
Expand All @@ -42,21 +42,21 @@
end

it 'creates with small round Viewport JSON' do
ad = AlexaDevice.new JSON.parse(small_hub_json)
ad = described_class.new JSON.parse(small_hub_json)

expect(ad.round?).to be_truthy
expect(ad.rectangle?).to be_falsey
expect(ad.apl?).to be_truthy
expect(ad).to be_round
expect(ad).not_to be_rectangle
expect(ad).to be_apl
expect(ad.height).to eq(480)
expect(ad.width).to eq(480)
end

it 'creates with medium Viewport JSON' do
ad = AlexaDevice.new JSON.parse(medium_hub_json)
ad = described_class.new JSON.parse(medium_hub_json)

expect(ad.round?).to be_falsey
expect(ad.rectangle?).to be_truthy
expect(ad.apl?).to be_truthy
expect(ad).not_to be_round
expect(ad).to be_rectangle
expect(ad).to be_apl
expect(ad.height).to eq(799)
expect(ad.width).to eq(1363)
end
Expand Down
40 changes: 20 additions & 20 deletions spec/alexa_event_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,24 @@
ENV['GOOGLE_API_KEY'] = 'SECRET'

RSpec.describe AlexaEvent do
context '#alternate_city_display' do
describe '#alternate_city_display' do
it 'handles incorrectly split city and state' do
ae = AlexaEvent.new request_builder 'LocationRequest', address_perm: false, args: { cityName: 'brooklyn', stateName: 'park' }
ae = described_class.new request_builder 'LocationRequest', address_perm: false, args: { cityName: 'brooklyn', stateName: 'park' }
expect(ae.alternate_city_display).to eq('Brooklyn Park')
end
end

context '#alternate_city_key' do
describe '#alternate_city_key' do
it 'handles incorrectly split city and state' do
ae = AlexaEvent.new request_builder 'LocationRequest', address_perm: false, args: { cityName: 'brooklyn', stateName: 'park' }
ae = described_class.new request_builder 'LocationRequest', address_perm: false, args: { cityName: 'brooklyn', stateName: 'park' }
expect(ae.alternate_city_key).to eq('brooklynpark')
end
end

context 'slots' do
context 'when slots' do
it 'handles nils for LaunchRequest' do
event = request_builder 'LaunchRequest', address_perm: false
ae = AlexaEvent.new event
ae = described_class.new event

expect(ae.slots[:cityName]).to be_nil
expect(ae.slots[:count]).to be_nil
Expand All @@ -34,7 +34,7 @@

it 'handles nils for IntentRequest' do
event = request_builder 'IntentRequest', address_perm: false
ae = AlexaEvent.new event
ae = described_class.new event

expect(ae.slots[:cityName].value).to be_nil
expect(ae.slots[:count]).to be_nil
Expand All @@ -44,72 +44,72 @@

it 'populates city' do
event = request_builder 'IntentRequest', address_perm: false, args: { cityName: 'saint paul' }
ae = AlexaEvent.new event
ae = described_class.new event

expect(ae.city.value).to eql('saint paul')
end

it 'populates state' do
event = request_builder 'IntentRequest', address_perm: false, args: { cityName: 'saint paul', stateName: 'minnesota' }
ae = AlexaEvent.new event
ae = described_class.new event

expect(ae.state.value).to eql('minnesota')
end
end

context 'payload' do
it 'should extract intent' do
context 'when payload' do
it 'extracts intent' do
event = request_builder 'LaunchRequest'
ae = AlexaEvent.new event
ae = described_class.new event
expect(ae.send(:find_intent_type)).to eql('LaunchRequest')
end

it 'confirms address permission yes' do
event = request_builder 'LaunchRequest', address_perm: true
ae = AlexaEvent.new event
ae = described_class.new event
expect(ae.send(:device_permission?)).to be_truthy
end

it 'confirms address permission no' do
event = request_builder 'LaunchRequest'
ae = AlexaEvent.new event
ae = described_class.new event
expect(ae.send(:device_permission?)).to be_falsey
end

it 'gets device id' do
event = request_builder 'LaunchRequest', address_perm: true
ae = AlexaEvent.new event
ae = described_class.new event
expect(ae.send(:device_id)).to eql('amzn1.ask.device.AEGXGYKTLQ')
end

it 'gets api access token' do
event = request_builder 'LaunchRequest'
ae = AlexaEvent.new event
ae = described_class.new event
expect(ae.send(:api_access_token)).to eql('eyJ0eXA')
end

it 'gets api endpoint' do
event = request_builder 'LaunchRequest'
ae = AlexaEvent.new event
ae = described_class.new event
expect(ae.send(:api_endpoint)).to eql('https://api.amazonalexa.com')
end

it 'gets request id' do
event = request_builder 'LaunchRequest'
ae = AlexaEvent.new event
ae = described_class.new event
expect(ae.send(:request_id)).to eql('amzn1.echo-api.request.888888')
end
end

context 'address request' do
context 'when address request' do
it 'gets address on success' do
expected_payload = JSON.parse '{"addressLine1":null,"addressLine2":null,"addressLine3":null,"districtOrCounty":null,"stateOrRegion":null,"city":null,"countryCode":"US","postalCode":"55104"}'
device_id = 'amzn1.ask.device.AEGXGYKTLQ'
api_access_token = 'eyJ0eXA'
event = request_builder('LaunchRequest', address_perm: true)
event['context']['System']['device']['deviceId'] = device_id
event['context']['System']['apiAccessToken'] = api_access_token
ae = AlexaEvent.new event
ae = described_class.new event

VCR.use_cassette('address_request') do
address = ae.send :amazon_address_request
Expand Down
Loading
Loading