# frozen_string_literal: true require 'test_helper' module Prices; end class Prices::AsAdminTest < ActionDispatch::IntegrationTest setup do admin = User.with_role(:admin).first login_as(admin, scope: :user) end test 'compute price for a simple training' do user = User.find_by(username: 'jdupond') availability = Availability.find(2) slot = Availability.find(2).slots.first printer_training = availability.trainings.first post '/api/prices/compute', params: { customer_id: user.id, items: [ { reservation: { reservable_id: printer_training.id, reservable_type: printer_training.class.name, slots_reservations_attributes: [ { slot_id: slot.id, offered: false } ] } } ] }.to_json, headers: default_headers # Check response format & status assert_equal 200, response.status, response.body assert_match Mime[:json].to_s, response.content_type # Check the price was computed correctly price = json_response(response.body) assert_equal (printer_training.trainings_pricings.where(group_id: user.group_id).first.amount / 100.0), price[:price], 'Computed price did not match training price' end test 'compute price for a machine reservation with an offered slot and a subscription' do user = User.find_by(username: 'jdupond') availability = Availability.find(3) laser = availability.machines.where(id: 1).first plan = Plan.find_by(group_id: user.group_id, interval: 'month') post '/api/prices/compute', params: { customer_id: user.id, items: [ { reservation: { reservable_id: laser.id, reservable_type: laser.class.name, slots_reservations_attributes: [ { slot_id: availability.slots.first.id, offered: true }, { slot_id: availability.slots.last.id, offered: false } ] } }, { subscription: { plan_id: plan.id } } ] }.to_json, headers: default_headers # Check response format & status assert_equal 200, response.status, response.body assert_match Mime[:json].to_s, response.content_type # Check the event was created correctly price = json_response(response.body) assert_equal ((laser.prices.where(group_id: user.group_id, plan_id: plan.id).first.amount + plan.amount) / 100.0), price[:price], 'Computed price did not match machine + subscription price' end end