[UNSTABLE] Added NullDevice, current_device, fixed lots of specs to match new data model
parent
390b3ccae9
commit
fdf56a3b28
|
@ -19,6 +19,10 @@ module Api
|
|||
|
||||
private
|
||||
|
||||
def current_device
|
||||
current_user.try(:device) || NullDevice.new(user: current_user)
|
||||
end
|
||||
|
||||
def authenticate_user!
|
||||
return true if current_user
|
||||
auth = Auth::Create.run(bot_token: request.headers["HTTP_BOT_TOKEN"],
|
||||
|
|
|
@ -4,18 +4,13 @@ module Api
|
|||
class DevicesController < Api::AbstractController
|
||||
before_action :set_device, only: [:show, :edit, :update, :destroy]
|
||||
|
||||
# GET /api/devices
|
||||
def index
|
||||
# GET /api/device
|
||||
def show
|
||||
@devices = Device.where(user_id: current_user.id)
|
||||
render json: @devices
|
||||
end
|
||||
|
||||
# GET /api/devices/1
|
||||
# def show
|
||||
# raise 'Not implemented.'
|
||||
# end
|
||||
|
||||
# POST /api/devices
|
||||
# POST /api/device
|
||||
def create
|
||||
@device = Device.new(device_params)
|
||||
@device.user = current_user
|
||||
|
@ -24,7 +19,7 @@ module Api
|
|||
end
|
||||
end
|
||||
|
||||
# PATCH/PUT /api/devices/1
|
||||
# PATCH/PUT /api/device
|
||||
def update
|
||||
if @device.update_attributes(device_params)
|
||||
render json: @device
|
||||
|
|
|
@ -35,7 +35,7 @@ module Api
|
|||
end
|
||||
|
||||
def must_own_sequence
|
||||
if sequence.user != current_user
|
||||
if sequence.device != current_device
|
||||
raise Errors::Forbidden, 'Not your Sequence object.'
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,7 +3,10 @@
|
|||
class Device
|
||||
include Mongoid::Document
|
||||
|
||||
belongs_to :user
|
||||
has_many :users
|
||||
has_many :schedules, dependent: :destroy
|
||||
has_many :sequences
|
||||
|
||||
|
||||
# The SkyNet UUID of the device
|
||||
field :uuid
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
class NullDevice < Device
|
||||
def save
|
||||
no(__method__)
|
||||
end
|
||||
|
||||
def save!
|
||||
no(__method__)
|
||||
end
|
||||
|
||||
def no(method)
|
||||
raise 'Cant call #{method} on a NullDevice'
|
||||
end
|
||||
end
|
|
@ -5,8 +5,8 @@ class Schedule
|
|||
|
||||
belongs_to :sequence
|
||||
validates_presence_of :sequence_id
|
||||
belongs_to :user
|
||||
validates_presence_of :user_id
|
||||
belongs_to :device
|
||||
validates_presence_of :device_id
|
||||
|
||||
field :start_time, type: Time
|
||||
field :end_time, type: Time
|
||||
|
|
|
@ -2,7 +2,7 @@ class Sequence
|
|||
include Mongoid::Document
|
||||
|
||||
belongs_to :schedule
|
||||
belongs_to :user
|
||||
belongs_to :device
|
||||
embeds_many :steps
|
||||
has_many :schedules, dependent: :destroy
|
||||
|
||||
|
|
|
@ -2,8 +2,7 @@
|
|||
class User
|
||||
include Mongoid::Document
|
||||
|
||||
has_many :devices, dependent: :destroy
|
||||
has_many :schedules, dependent: :destroy
|
||||
belongs_to :device, dependent: :destroy
|
||||
|
||||
field :name, type: String
|
||||
validates_uniqueness_of :name
|
||||
|
@ -12,8 +11,6 @@ class User
|
|||
field :email, type: String, default: ""
|
||||
validates_uniqueness_of :email
|
||||
|
||||
has_many :sequences
|
||||
|
||||
# BEGIN DEVISE CRAP ==========================================================
|
||||
devise :database_authenticatable, :registerable, :recoverable, :rememberable,
|
||||
:trackable, :validatable #, :omniauthable
|
||||
|
|
|
@ -6,7 +6,7 @@ module Schedules
|
|||
|
||||
required do
|
||||
model :sequence, class: Sequence
|
||||
model :user, class: User
|
||||
model :device, class: Device
|
||||
integer :repeat
|
||||
string :time_unit, in: Schedule::UNITS_OF_TIME
|
||||
end
|
||||
|
|
|
@ -3,7 +3,7 @@ module Sequences
|
|||
using MongoidRefinements
|
||||
|
||||
required do
|
||||
model :user, class: User
|
||||
model :device, class: Device
|
||||
string :name
|
||||
array :steps, default: [] do
|
||||
model :step, builder: Steps::Initialize, new_records: true
|
||||
|
|
|
@ -2,7 +2,7 @@ FarmBot::Application.routes.draw do
|
|||
|
||||
mount JasmineRails::Engine => '/specs' if defined?(JasmineRails)
|
||||
namespace :api, defaults: {format: :json} do
|
||||
resources :devices, only: [:index, :destroy, :create, :update]
|
||||
resource :device, only: [:show, :destroy, :create, :update]
|
||||
resources :sequences, only: [:create, :update, :destroy, :index, :show] do
|
||||
resources :steps, only: [:show, :create, :index, :update, :destroy]
|
||||
end
|
||||
|
|
|
@ -6,8 +6,8 @@ describe Api::StepsController do
|
|||
|
||||
describe '#create' do
|
||||
|
||||
let(:sequence) { FactoryGirl.create(:sequence) }
|
||||
let(:user) { sequence.user }
|
||||
let(:sequence) { FactoryGirl.create(:sequence, device: user.device) }
|
||||
let(:user) { FactoryGirl.create :user }
|
||||
|
||||
it 'creates a new step sequence' do
|
||||
sign_in user
|
||||
|
|
|
@ -5,11 +5,13 @@ describe Api::StepsController do
|
|||
include Devise::TestHelpers
|
||||
|
||||
describe '#destroy' do
|
||||
let(:user) { FactoryGirl.create(:user) }
|
||||
let(:sequence) do
|
||||
FactoryGirl.create(:sequence, steps: FactoryGirl.build_list(:step, 2))
|
||||
FactoryGirl.create(:sequence,
|
||||
steps: FactoryGirl.build_list(:step, 2),
|
||||
device: user.device)
|
||||
end
|
||||
let(:step) { sequence.steps[0] }
|
||||
let(:user) { sequence.user }
|
||||
|
||||
it 'destroys a step sequence' do
|
||||
sign_in user
|
||||
|
|
|
@ -5,8 +5,8 @@ describe Api::StepsController do
|
|||
include Devise::TestHelpers
|
||||
|
||||
describe '#index' do
|
||||
let(:sequence) { FactoryGirl.create(:sequence) }
|
||||
let(:user) { sequence.user }
|
||||
let(:user) { FactoryGirl.create(:user) }
|
||||
let(:sequence) { FactoryGirl.create(:sequence, device: user.device) }
|
||||
|
||||
it 'retrieves all steps for a sequence' do
|
||||
sign_in user
|
||||
|
|
|
@ -4,8 +4,8 @@ describe Api::StepsController do
|
|||
include Devise::TestHelpers
|
||||
|
||||
describe '#show' do
|
||||
let(:sequence) { FactoryGirl.create(:sequence) }
|
||||
let(:user) { sequence.user }
|
||||
let(:sequence) { FactoryGirl.create(:sequence, device: user.device) }
|
||||
let(:user) { FactoryGirl.create :user }
|
||||
|
||||
it 'retrieves all steps for a sequence' do
|
||||
id = sequence.steps.first._id.to_s
|
||||
|
|
|
@ -5,9 +5,9 @@ describe Api::StepsController do
|
|||
include Devise::TestHelpers
|
||||
|
||||
describe '#update' do
|
||||
let(:sequence) { FactoryGirl.create(:sequence) }
|
||||
let(:sequence) { FactoryGirl.create(:sequence, device: user.device) }
|
||||
let(:step) { sequence.steps[0] }
|
||||
let(:user) { sequence.user }
|
||||
let(:user) { FactoryGirl.create :user }
|
||||
|
||||
it 'updates a step' do
|
||||
sign_in user
|
||||
|
|
|
@ -3,7 +3,6 @@ require 'securerandom'
|
|||
|
||||
FactoryGirl.define do
|
||||
factory :device do
|
||||
user
|
||||
name Faker::Internet.user_name
|
||||
uuid SecureRandom.uuid
|
||||
token SecureRandom.urlsafe_base64
|
||||
|
|
|
@ -7,7 +7,7 @@ FactoryGirl.define do
|
|||
after(:build) do |s|
|
||||
s.next_time ||= s.calculate_next_occurence
|
||||
s.sequence ||= create(:sequence)
|
||||
s.user ||= s.sequence.user
|
||||
s.device ||= s.sequence.device
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -4,7 +4,7 @@ FactoryGirl.define do
|
|||
factory :sequence do
|
||||
name { Faker::Company.catch_phrase }
|
||||
color { Sequence::COLORS.sample }
|
||||
user
|
||||
device
|
||||
steps { FactoryGirl.build_list(:step, 1) }
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,11 +2,10 @@
|
|||
|
||||
FactoryGirl.define do
|
||||
factory :user do
|
||||
device
|
||||
name { Faker::Name.name }
|
||||
email { Faker::Internet.email }
|
||||
password { Faker::Internet.password(8) }
|
||||
after(:create) do |user|
|
||||
FactoryGirl.create(:device, user: user)
|
||||
end
|
||||
after(:create) { |user| user.device ||= FactoryGirl.create(:device) }
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Device do
|
||||
let(:user) { FactoryGirl.create(:user) }
|
||||
let(:device){ FactoryGirl.create(:device, user: user)}
|
||||
let(:device){ FactoryGirl.create(:device, users: [FactoryGirl.create(:user)])}
|
||||
let(:user) { device.users.first }
|
||||
|
||||
it 'is associated with a user' do
|
||||
expect(device.user).to be_kind_of(User)
|
||||
expect(user.devices).to be_kind_of(Array)
|
||||
expect(user.devices.first).to be_kind_of(Device)
|
||||
expect(device.users.first).to be_kind_of(User)
|
||||
expect(user.device).to be_kind_of(Device)
|
||||
end
|
||||
|
||||
it 'destroys dependant devices' do
|
||||
|
|
|
@ -3,17 +3,17 @@ require 'spec_helper'
|
|||
describe Schedules::Create do
|
||||
it 'Builds a schedule' do
|
||||
seq = FactoryGirl.create(:sequence)
|
||||
user = seq.user
|
||||
device = seq.device
|
||||
start_time = '2015-02-17T15:16:17.000Z'
|
||||
end_time = '2099-02-17T18:19:20.000Z'
|
||||
schedule = Schedules::Create.run!(user: user,
|
||||
schedule = Schedules::Create.run!(device: device,
|
||||
sequence: seq,
|
||||
start_time: start_time,
|
||||
end_time: end_time,
|
||||
repeat: 4,
|
||||
time_unit: 'minutely').reload
|
||||
expect(schedule).to be_kind_of(Schedule)
|
||||
expect(schedule.user).to eq(user)
|
||||
expect(schedule.device).to eq(device)
|
||||
expect(schedule.sequence).to eq(seq)
|
||||
expect(schedule.start_time.to_time).to eq(Time.parse start_time)
|
||||
expect(schedule.end_time.to_time).to eq(Time.parse end_time)
|
||||
|
|
|
@ -2,6 +2,7 @@ require 'spec_helper'
|
|||
|
||||
describe Steps::Create do
|
||||
let(:user) { FactoryGirl.create(:user) }
|
||||
let(:device) { user.device }
|
||||
let(:mutation) { Sequences::Create }
|
||||
let(:step) do
|
||||
{ message_type: 'move_relative',
|
||||
|
@ -14,18 +15,16 @@ describe Steps::Create do
|
|||
end
|
||||
|
||||
let(:valid_params) do
|
||||
{ user: user,
|
||||
{ device: device,
|
||||
name: 'Hi.',
|
||||
steps: [step] }
|
||||
end
|
||||
|
||||
it 'Builds a `sequence`' do
|
||||
outcome = mutation.run(valid_params)
|
||||
expect(outcome.success?).to be_truthy
|
||||
seq = outcome.result
|
||||
seq = mutation.run!(valid_params)
|
||||
|
||||
expect(seq.steps.count).to eq(1)
|
||||
expect(seq.name).to eq('Hi.')
|
||||
expect(seq.user).to eq(user)
|
||||
expect(seq.device).to eq(device)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,8 +2,9 @@ require 'spec_helper'
|
|||
|
||||
describe Steps::Update do
|
||||
let(:user) { FactoryGirl.create(:user) }
|
||||
let(:device) { user.device }
|
||||
let(:mutation) { Steps::Update }
|
||||
let(:sequence) { FactoryGirl.create(:sequence, user: user) }
|
||||
let(:sequence) { FactoryGirl.create(:sequence, device: device) }
|
||||
|
||||
it 'automatically populates position field via black magic.' do
|
||||
# This feature is a crime against humanity. Sorry :(
|
||||
|
@ -38,7 +39,7 @@ describe Steps::Update do
|
|||
end
|
||||
|
||||
it 'moves first to middle' do
|
||||
sequence = Sequences::Create.run!(name: 'test', user: user)
|
||||
sequence = Sequences::Create.run!(name: 'test', device: device)
|
||||
|
||||
a = Steps::Create.run!(message_type: 'pin_write',
|
||||
sequence: sequence,
|
||||
|
|
Loading…
Reference in New Issue