# frozen_string_literal: true require 'test_helper' module Prices class 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) 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_attributes: [ { availability_id: availability.id, end_at: availability.end_at, offered: false, start_at: availability.start_at } ] } } ] }.to_json, headers: default_headers # Check response format & status assert_equal 200, response.status, response.body assert_equal Mime[:json], 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.where(group_id: user.group_id, interval: 'month').first post '/api/prices/compute', params: { customer_id: user.id, items: [ { reservation: { reservable_id: laser.id, reservable_type: laser.class.name, slots_attributes: [ { availability_id: availability.id, end_at: (availability.start_at + 1.hour).strftime('%Y-%m-%d %H:%M:%S.%9N Z'), offered: true, start_at: availability.start_at.strftime('%Y-%m-%d %H:%M:%S.%9N Z') }, { availability_id: availability.id, end_at: (availability.start_at + 2.hour).strftime('%Y-%m-%d %H:%M:%S.%9N Z'), offered: false, start_at: (availability.start_at + 1.hour).strftime('%Y-%m-%d %H:%M:%S.%9N Z') } ] } }, { subscription: { plan_id: plan.id } } ] }.to_json, headers: default_headers # Check response format & status assert_equal 200, response.status, response.body assert_equal Mime[:json], 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 end