Farmbot-Web-App/spec/controllers/api/farm_events/farm_events_update_spec.rb

129 lines
3.9 KiB
Ruby

require "spec_helper"
describe Api::FarmEventsController do
include Devise::Test::ControllerHelpers
describe "#update" do
let(:user) { FactoryBot.create(:user) }
let(:fe) { FactoryBot.create(:farm_event, device: user.device) }
it "allows authorized modification" do
sign_in user
id = FactoryBot.create(:farm_event, device: user.device).id
input = { id: id, farm_event: { repeat: 66 } }
patch :update, format: :json, body: input.to_json, params: {id: id}
expect(response.status).to eq(200)
end
it "prevents unauthorized modification" do
sign_in user
id = FactoryBot.create(:farm_event).id
input = { id: id, repeat: 66 }
patch :update, format: :json, body: input.to_json, params: {id: id}
expect(response.status).to eq(403)
expect(json[:error]).to include("Not your farm_event")
end
it "sets end_time to self.start_time if no start_time is passed in" do
sign_in user
id = FactoryBot.create(:farm_event, device: user.device).id
patch :update,
format: :json,
body: { id: id, repeat: 1, time_unit: FarmEvent::NEVER }.to_json,
params: { id: id }
fe = FarmEvent.find(id)
expect(response.status).to eq(200)
expect(json[:end_time]).to eq((fe.start_time + 1.minute).as_json)
expect(fe.end_time).to eq(fe.start_time + 1.minute)
end
it "disallows start/end times that are outside of a 20 year window" do
sign_in user
id = FactoryBot.create(:farm_event, device: user.device).id
patch :update,
format: :json,
body: { id: id, end_time: "+045633-08-18T13:25:00.000Z" }.to_json,
params: { id: id }
expect(response.status).to eq(422)
expect(json[:end_time]).to include("too far in the future")
end
def create_fe_with_fragment
fragment = Fragment.from_celery(
owner: fe,
device: user.device,
kind: "internal_farm_event",
args: {},
body: [
{
kind: "parameter_application",
args: {
label: "foo",
data_value: { kind: "coordinate", args: { x: 0, y: 0, z: 0 } }
}
}
])
return fe
end
def update_body(fe, body)
sign_in user
patch :update,
format: :json,
body: { body: body }.to_json,
params: { id: fe.id }
end
it "ignores fragment when body is `nil`" do
fe = create_fe_with_fragment
fragment_b4 = fe.fragment.id
expect(fe.fragment).not_to be(nil)
update_body(fe, nil)
expect(response.status).to eq(200)
expect(fe.reload.fragment).not_to be(nil)
expect(fe.fragment.id).to eq(fragment_b4)
end
it "deletes old fragment when body is `[]`" do
fe = create_fe_with_fragment
expect(fe.fragment).not_to be(nil)
update_body(fe, [])
expect(response.status).to eq(200)
expect(fe.reload.fragment).to be(nil)
expect(json.fetch(:body)).to eq([])
end
it "replaces old fragment when given a new one" do
fe = create_fe_with_fragment
expect(fe.fragment).not_to be(nil)
update_body(fe, nil)
expect(response.status).to eq(200)
expect(fe.reload.fragment).not_to be(nil)
end
it "inserts new fragment when there originally was none" do
fe = FactoryBot.create(:farm_event, device: user.device)
expect(fe.fragment).to be(nil)
body = [
{
kind: "parameter_application",
args: {
label: "bar",
data_value: {
kind: "coordinate",
args: {
x: 1,
y: 2,
z: 3
}
}
}
}
]
update_body(fe, body)
expect(response.status).to eq(200)
expect(fe.reload.fragment).not_to be(nil)
expect(json.fetch(:body)).to eq(body)
end
end
end