require "test_helper" class MeasurementsControllerTest < ActionDispatch::IntegrationTest setup do host! '127.0.0.1' @user = users(:alice) post new_user_session_path, params: { user: { email: @user.email, password: 'alice' } } @quantity = @user.quantities.create!(name: 'Weight') @unit = @user.units.create!(symbol: 'kg') end test "index returns ok" do get measurements_path assert_response :success end test "index requires authentication" do delete destroy_user_session_path get measurements_path assert_response :redirect end test "create records readout with taken_at" do taken_at = 1.day.ago.change(usec: 0) assert_difference -> { @user.readouts.count } do post measurements_path, params: { taken_at: taken_at.iso8601, readouts: [{ quantity_id: @quantity.id, value: '82.5', unit_id: @unit.id }] }, as: :turbo_stream end assert_response :success assert_equal taken_at, @user.readouts.last.taken_at end test "create with no readouts selected shows alert" do post measurements_path, params: { taken_at: Time.now.iso8601 }, as: :turbo_stream assert_response :success end test "destroy removes readout" do readout = @user.readouts.create!(quantity: @quantity, unit: @unit, value: 82.5, taken_at: 1.day.ago) assert_difference -> { @user.readouts.count }, -1 do delete measurement_path(readout), as: :turbo_stream end assert_response :success end test "destroy cannot remove another user's readout" do other_quantity = users(:bob).quantities.create!(name: 'Weight') other_unit = users(:bob).units.create!(symbol: 'kg') readout = users(:bob).readouts.create!(quantity: other_quantity, unit: other_unit, value: 70.0, taken_at: 1.day.ago) assert_no_difference -> { users(:bob).readouts.count } do delete measurement_path(readout), as: :turbo_stream end end test "update changes readout value" do readout = @user.readouts.create!(quantity: @quantity, unit: @unit, value: 82.5, taken_at: 1.day.ago) patch measurement_path(readout), params: { readout: { value: '83.0', unit_id: @unit.id, taken_at: readout.taken_at.iso8601 } }, as: :turbo_stream assert_response :success assert_in_delta 83.0, readout.reload.value end end