[UNSTABLE] Added NullDevice, current_device, fixed lots of specs to match new data model

pull/202/head
Rick Carlino 2015-07-08 09:32:35 -05:00
parent 390b3ccae9
commit fdf56a3b28
24 changed files with 63 additions and 52 deletions

View File

@ -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"],

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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,