mirror of
https://github.com/fspc/bike-database.git
synced 2025-02-23 01:23:24 -05:00
lk | posts to bike index in sidekiq job
This commit is contained in:
parent
3224faab0e
commit
356098b7a6
3
.env.development
Normal file
3
.env.development
Normal file
@ -0,0 +1,3 @@
|
||||
OWNER_EMAIL: 'coolemail@example.com'
|
||||
BIKE_INDEX_URL: 'http://lvh.me:3000'
|
||||
BIKE_INDEX_TOKEN: 'asdfklkjasfdljkd3asdfjkl2asdf'
|
6
Gemfile
6
Gemfile
@ -7,6 +7,7 @@ gem 'devise'
|
||||
gem 'faraday', '0.9.1'
|
||||
gem 'oauth2', '1.0.0'
|
||||
gem 'dotenv-rails'
|
||||
gem 'sidekiq'
|
||||
|
||||
#SCSS & Bootstrap
|
||||
gem 'bootstrap-sass', '2.3.2.0'
|
||||
@ -27,12 +28,15 @@ group :test, :development do
|
||||
gem 'better_errors'
|
||||
gem 'assert_difference'
|
||||
gem 'binding_of_caller'
|
||||
gem 'webmock', '1.21.0'
|
||||
|
||||
# Uncomment this line on OS X.
|
||||
gem 'growl', '1.0.3'
|
||||
end
|
||||
|
||||
group :test do
|
||||
gem 'webmock', '1.21.0'
|
||||
end
|
||||
|
||||
gem 'uglifier', '2.1.1'
|
||||
gem 'jquery-rails', '3.0.4'
|
||||
gem 'jquery-turbolinks'
|
||||
|
16
Gemfile.lock
16
Gemfile.lock
@ -46,6 +46,8 @@ GEM
|
||||
rack (>= 1.0.0)
|
||||
rack-test (>= 0.5.4)
|
||||
xpath (~> 2.0)
|
||||
celluloid (0.16.0)
|
||||
timers (~> 4.0.0)
|
||||
childprocess (0.5.6)
|
||||
ffi (~> 1.0, >= 1.0.11)
|
||||
coderay (1.1.0)
|
||||
@ -56,6 +58,7 @@ GEM
|
||||
coffee-script-source
|
||||
execjs
|
||||
coffee-script-source (1.9.1.1)
|
||||
connection_pool (2.1.3)
|
||||
crack (0.4.2)
|
||||
safe_yaml (~> 1.0.0)
|
||||
debug_inspector (0.0.2)
|
||||
@ -87,6 +90,7 @@ GEM
|
||||
haml (4.0.6)
|
||||
tilt
|
||||
hike (1.2.3)
|
||||
hitimes (1.2.2)
|
||||
i18n (0.7.0)
|
||||
jbuilder (1.0.2)
|
||||
activesupport (>= 3.0.0)
|
||||
@ -149,6 +153,9 @@ GEM
|
||||
rake (10.4.2)
|
||||
rdoc (3.12.2)
|
||||
json (~> 1.4)
|
||||
redis (3.2.1)
|
||||
redis-namespace (1.5.1)
|
||||
redis (~> 3.0, >= 3.0.4)
|
||||
responders (1.1.2)
|
||||
railties (>= 3.2, < 4.2)
|
||||
rspec (3.2.0)
|
||||
@ -188,6 +195,12 @@ GEM
|
||||
multi_json (~> 1.0)
|
||||
rubyzip (< 1.0.0)
|
||||
websocket (~> 1.0.4)
|
||||
sidekiq (3.3.3)
|
||||
celluloid (>= 0.16.0)
|
||||
connection_pool (>= 2.1.1)
|
||||
json
|
||||
redis (>= 3.0.6)
|
||||
redis-namespace (>= 1.3.1)
|
||||
slop (3.6.0)
|
||||
sprockets (2.12.3)
|
||||
hike (~> 1.2)
|
||||
@ -201,6 +214,8 @@ GEM
|
||||
thor (0.19.1)
|
||||
thread_safe (0.3.5)
|
||||
tilt (1.4.1)
|
||||
timers (4.0.1)
|
||||
hitimes
|
||||
treetop (1.4.15)
|
||||
polyglot
|
||||
polyglot (>= 0.3.1)
|
||||
@ -252,6 +267,7 @@ DEPENDENCIES
|
||||
sass-rails (~> 4.0.0)
|
||||
sdoc (= 0.3.20)
|
||||
selenium-webdriver (= 2.35.1)
|
||||
sidekiq
|
||||
turbolinks (= 1.1.1)
|
||||
uglifier (= 2.1.1)
|
||||
webmock (= 1.21.0)
|
||||
|
@ -14,6 +14,6 @@
|
||||
//= require jquery_ujs
|
||||
//= require turbolinks
|
||||
//= require_tree .
|
||||
//= require bootstrap
|
||||
//= require bootstrap
|
||||
//= require bootstrap-datepicker
|
||||
//= require bootstrap-select
|
||||
//= require bootstrap-select
|
||||
|
6
app/assets/javascripts/bikes.coffee
Normal file
6
app/assets/javascripts/bikes.coffee
Normal file
@ -0,0 +1,6 @@
|
||||
seatTubeIn = $(".seat-tube-in")
|
||||
seatTubeCm = $(".seat-tube-cm")
|
||||
|
||||
seatTubeIn.on("change", () ->
|
||||
seatTubeCm.val(parseFloat(seatTubeIn.val())*2.54)
|
||||
)
|
@ -1,2 +0,0 @@
|
||||
// Place all the behaviors and hooks related to the matching controller here.
|
||||
// All this logic will automatically be available in application.js.
|
@ -12,7 +12,7 @@ class Bike < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def client
|
||||
client = Client.find_by bike_id: self.id
|
||||
Client.find_by bike_id: self.id
|
||||
end
|
||||
|
||||
def ready_for_pickup?
|
||||
@ -35,22 +35,7 @@ class Bike < ActiveRecord::Base
|
||||
|
||||
def post_to_bike_index
|
||||
return true if self.bike_index_id.present?
|
||||
|
||||
conn = Faraday.new(:url => "#{ENV['BIKE_INDEX_URL']}") do |faraday|
|
||||
faraday.request :url_encoded
|
||||
faraday.response :logger
|
||||
faraday.adapter Faraday.default_adapter
|
||||
end
|
||||
|
||||
response = conn.post do |req|
|
||||
req.url "/api/v2/bikes?access_token=#{ENV['BIKE_INDEX_TOKEN']}"
|
||||
req.headers['Content-Type'] = 'application/json'
|
||||
req.body = BikeIndexBikeGenerator.create_bike_index_bike(self)
|
||||
end
|
||||
|
||||
self.update_attribute :bike_index_id, JSON.parse(response.body)['bike']['id'] if response.status == 201
|
||||
|
||||
|
||||
BikeIndexLogger.perform_async(self.id)
|
||||
end
|
||||
|
||||
end
|
||||
|
@ -1,13 +0,0 @@
|
||||
class BikeIndexBikeGenerator
|
||||
def self.create_bike_index_bike(bike)
|
||||
{
|
||||
serial: bike.serial_number,
|
||||
manufacturer: bike.brand,
|
||||
owner_email: ENV["OWNER_EMAIL"],
|
||||
color: bike.color,
|
||||
is_for_sale: bike.purpose != "freecyclery",
|
||||
frame_model: bike.model,
|
||||
no_notify: true
|
||||
}.to_json
|
||||
end
|
||||
end
|
32
app/workers/bike_index_logger.rb
Normal file
32
app/workers/bike_index_logger.rb
Normal file
@ -0,0 +1,32 @@
|
||||
class BikeIndexLogger
|
||||
include Sidekiq::Worker
|
||||
def perform(bike_id)
|
||||
bike = Bike.find(bike_id)
|
||||
|
||||
conn = Faraday.new(:url => "#{ENV['BIKE_INDEX_URL']}") do |faraday|
|
||||
faraday.request :url_encoded
|
||||
faraday.response :logger
|
||||
faraday.adapter Faraday.default_adapter
|
||||
end
|
||||
|
||||
response = conn.post do |req|
|
||||
req.url "/api/v2/bikes?access_token=#{ENV['BIKE_INDEX_TOKEN']}"
|
||||
req.headers['Content-Type'] = 'application/json'
|
||||
req.body = BikeIndexLogger.create_bike_index_bike(bike)
|
||||
end
|
||||
|
||||
bike.update_attribute :bike_index_id, JSON.parse(response.body)['bike']['id'] if response.status == 201
|
||||
end
|
||||
|
||||
def self.create_bike_index_bike(bike)
|
||||
{
|
||||
serial: bike.serial_number,
|
||||
manufacturer: bike.brand,
|
||||
owner_email: ENV["OWNER_EMAIL"],
|
||||
color: bike.color,
|
||||
is_for_sale: bike.purpose != "freecyclery",
|
||||
frame_model: bike.model,
|
||||
no_notify: true
|
||||
}.to_json
|
||||
end
|
||||
end
|
@ -1,18 +1,15 @@
|
||||
require 'spec_helper'
|
||||
|
||||
describe Bike do
|
||||
it "posts to bike index" do
|
||||
describe "#post_to_bike_index" do
|
||||
it "calls BikeIndexLogger if no bike_index_id is present" do
|
||||
expect(BikeIndexLogger).to receive(:perform_async)
|
||||
create(:bike, bike_index_id: nil)
|
||||
end
|
||||
|
||||
WebMock.stub_request(:post, "http://lvh.me:3000/api/v2/bikes?access_token=asdfklkjasfdljkd3asdfjkl2asdf")
|
||||
.and_return(:status => 201, :body => {bike: {id: 1}}.to_json, :headers => {})
|
||||
bike = create(:bike, bike_index_id: nil)
|
||||
expect(bike.bike_index_id).to eq(1)
|
||||
|
||||
end
|
||||
it "assigns bike_index_id after posting to bike index" do
|
||||
WebMock.stub_request(:post, "http://lvh.me:3000/api/v2/bikes?access_token=asdfklkjasfdljkd3asdfjkl2asdf")
|
||||
.and_return(:status => 400, :body => {error: "error"}.to_json, :headers => {})
|
||||
bike = create(:bike, bike_index_id: nil)
|
||||
expect(bike.bike_index_id).to_not be_present
|
||||
it "returns true if bike_index_id is present" do
|
||||
bike = create(:bike, bike_index_id: 1)
|
||||
expect(bike.post_to_bike_index).to be_truthy
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -1,42 +0,0 @@
|
||||
require 'spec_helper'
|
||||
|
||||
describe BikeIndexBikeGenerator do
|
||||
it "creates a bike with required attributes" do
|
||||
bike = create(:bike)
|
||||
|
||||
bikeIndexBikeJson = BikeIndexBikeGenerator.create_bike_index_bike(bike)
|
||||
|
||||
bikeIndexBike = JSON.parse(bikeIndexBikeJson)
|
||||
|
||||
expect(bikeIndexBike["serial"]).to eq(bike.serial_number)
|
||||
expect(bikeIndexBike["manufacturer"]).to eq(bike.brand)
|
||||
expect(bikeIndexBike["frame_model"]).to eq(bike.model)
|
||||
expect(bikeIndexBike["owner_email"]).to eq(ENV["OWNER_EMAIL"])
|
||||
expect(bikeIndexBike["no_notify"]).to be_truthy
|
||||
expect(bikeIndexBike["color"]).to eq(bike.color)
|
||||
|
||||
end
|
||||
|
||||
describe "freecyclery bikes" do
|
||||
it "is_for_sale is false" do
|
||||
bike = create(:bike, purpose: "freecyclery")
|
||||
bikeIndexBikeJson = BikeIndexBikeGenerator.create_bike_index_bike(bike)
|
||||
|
||||
bikeIndexBike = JSON.parse(bikeIndexBikeJson)
|
||||
|
||||
expect(bikeIndexBike["is_for_sale"]).to be_falsey
|
||||
end
|
||||
end
|
||||
|
||||
describe "sale bikes" do
|
||||
it "is_for_sale is true" do
|
||||
bike = create(:bike, purpose: "sale")
|
||||
bikeIndexBikeJson = BikeIndexBikeGenerator.create_bike_index_bike(bike)
|
||||
|
||||
bikeIndexBike = JSON.parse(bikeIndexBikeJson)
|
||||
|
||||
expect(bikeIndexBike["is_for_sale"]).to be_truthy
|
||||
end
|
||||
end
|
||||
|
||||
end
|
63
spec/workers/bike_index_logger_spec.rb
Normal file
63
spec/workers/bike_index_logger_spec.rb
Normal file
@ -0,0 +1,63 @@
|
||||
require 'spec_helper'
|
||||
|
||||
describe BikeIndexLogger do
|
||||
context "#create_bike_index_bike" do
|
||||
it "creates a bike with required attributes" do
|
||||
bike = build(:bike)
|
||||
allow(Bike).to receive(:find).and_return(bike)
|
||||
|
||||
bikeIndexBikeJson = BikeIndexLogger.create_bike_index_bike(bike)
|
||||
|
||||
bikeIndexBike = JSON.parse(bikeIndexBikeJson)
|
||||
|
||||
expect(bikeIndexBike["serial"]).to eq(bike.serial_number)
|
||||
expect(bikeIndexBike["manufacturer"]).to eq(bike.brand)
|
||||
expect(bikeIndexBike["frame_model"]).to eq(bike.model)
|
||||
expect(bikeIndexBike["owner_email"]).to eq(ENV["OWNER_EMAIL"])
|
||||
expect(bikeIndexBike["no_notify"]).to be_truthy
|
||||
expect(bikeIndexBike["color"]).to eq(bike.color)
|
||||
|
||||
end
|
||||
|
||||
describe "freecyclery bikes" do
|
||||
it "is_for_sale is false" do
|
||||
bike = build(:bike, purpose: "freecyclery")
|
||||
allow(Bike).to receive(:find).and_return(bike)
|
||||
bikeIndexBikeJson = BikeIndexLogger.create_bike_index_bike(bike)
|
||||
bikeIndexBike = JSON.parse(bikeIndexBikeJson)
|
||||
expect(bikeIndexBike["is_for_sale"]).to be_falsey
|
||||
end
|
||||
end
|
||||
|
||||
describe "sale bikes" do
|
||||
it "is_for_sale is true" do
|
||||
bike = build(:bike, purpose: "sale")
|
||||
allow(Bike).to receive(:find).and_return(bike)
|
||||
bikeIndexBikeJson = BikeIndexLogger.create_bike_index_bike(bike)
|
||||
bikeIndexBike = JSON.parse(bikeIndexBikeJson)
|
||||
expect(bikeIndexBike["is_for_sale"]).to be_truthy
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "assigns bike_index_id on successful response from bike index" do
|
||||
WebMock.stub_request(:post, "http://lvh.me:3000/api/v2/bikes?access_token=asdfklkjasfdljkd3asdfjkl2asdf")
|
||||
.and_return(:status => 201, :body => {bike: {id: 1}}.to_json, :headers => {})
|
||||
allow_any_instance_of(Bike).to receive(:post_to_bike_index)
|
||||
bike = create(:bike, bike_index_id: nil)
|
||||
allow(Bike).to receive(:find).and_return(bike)
|
||||
BikeIndexLogger.new.perform(bike.id)
|
||||
expect(bike.bike_index_id).to eq(1)
|
||||
end
|
||||
|
||||
it "does not assign bike_index_id on unsuccessful response from bike index" do
|
||||
WebMock.stub_request(:post, "http://lvh.me:3000/api/v2/bikes?access_token=asdfklkjasfdljkd3asdfjkl2asdf")
|
||||
.and_return(:status => 400, :body => {error: "error"}.to_json, :headers => {})
|
||||
allow_any_instance_of(Bike).to receive(:post_to_bike_index)
|
||||
bike = create(:bike, bike_index_id: nil)
|
||||
allow(Bike).to receive(:find).and_return(bike)
|
||||
BikeIndexLogger.new.perform(bike.id)
|
||||
expect(bike.bike_index_id).to_not be_present
|
||||
end
|
||||
|
||||
end
|
Loading…
x
Reference in New Issue
Block a user