mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2024-11-29 10:24:20 +01:00
112 lines
3.4 KiB
Ruby
112 lines
3.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class AccountingPeriodTest < ActionDispatch::IntegrationTest
|
|
|
|
def setup
|
|
@admin = User.find_by(username: 'admin')
|
|
login_as(@admin, scope: :user)
|
|
end
|
|
|
|
test 'admin closes an accounting period' do
|
|
start_at = '2012-01-01T00:00:00.000Z'
|
|
end_at = '2012-12-31T00:00:00.000Z'
|
|
|
|
post '/api/accounting_periods',
|
|
{
|
|
accounting_period: {
|
|
start_at: start_at,
|
|
end_at: end_at
|
|
}
|
|
}.to_json, default_headers
|
|
|
|
# Check response format & status
|
|
assert_equal 201, response.status, response.body
|
|
assert_equal Mime::JSON, response.content_type
|
|
|
|
# Check the correct period was closed successfully
|
|
period = json_response(response.body)
|
|
accounting_period = AccountingPeriod.find(period[:id])
|
|
assert_dates_equal start_at.to_date, period[:start_at]
|
|
assert_dates_equal end_at.to_date, period[:end_at]
|
|
|
|
# Check archive file was created
|
|
assert FileTest.exists? accounting_period.archive_file
|
|
|
|
# Extract archive
|
|
require 'tmpdir'
|
|
require 'fileutils'
|
|
dest = "#{Dir.tmpdir}/accounting/#{accounting_period.id}"
|
|
FileUtils.mkdir_p "#{dest}/accounting"
|
|
Zip::File.open(accounting_period.archive_file) do |zip_file|
|
|
# Handle entries one by one
|
|
zip_file.each do |entry|
|
|
# Extract to file/directory/symlink
|
|
entry.extract("#{dest}/#{entry.name}")
|
|
end
|
|
end
|
|
|
|
# Check archive matches
|
|
require 'checksum'
|
|
sumfile = File.read("#{dest}/checksum.sha256").split("\t")
|
|
assert_equal sumfile[0], Checksum.file("#{dest}/#{sumfile[1]}"), 'archive checksum does not match'
|
|
|
|
archive = File.read("#{dest}/#{sumfile[1]}")
|
|
archive_json = JSON.parse(archive)
|
|
invoices = Invoice.where(
|
|
'created_at >= :start_date AND created_at <= :end_date',
|
|
start_date: start_at.to_datetime, end_date: end_at.to_datetime
|
|
)
|
|
|
|
assert_equal invoices.count, archive_json['invoices'].count
|
|
assert_equal accounting_period.footprint, archive_json['period_footprint']
|
|
|
|
require 'version'
|
|
assert_equal Version.current, archive_json['software']['version']
|
|
|
|
# we clean up the files before quitting
|
|
FileUtils.rm_rf(dest)
|
|
FileUtils.rm_rf(accounting_period.archive_folder)
|
|
end
|
|
|
|
test 'admin tries to closes a too long period' do
|
|
start_at = '2012-01-01T00:00:00.000Z'
|
|
end_at = '2014-12-31T00:00:00.000Z'
|
|
diff = (end_at.to_date - start_at.to_date).to_i
|
|
|
|
post '/api/accounting_periods',
|
|
{
|
|
accounting_period: {
|
|
start_at: start_at,
|
|
end_at: end_at
|
|
}
|
|
}.to_json, default_headers
|
|
|
|
# Check response format & status
|
|
assert_equal 422, response.status, response.body
|
|
assert_equal Mime::JSON, response.content_type
|
|
|
|
# check the error
|
|
assert_match(/#{I18n.t('errors.messages.invalid_duration', DAYS: diff)}/, response.body)
|
|
end
|
|
|
|
test 'admin tries to closes an overlapping period' do
|
|
start_at = '2014-12-01T00:00:00.000Z'
|
|
end_at = '2015-02-27T00:00:00.000Z'
|
|
|
|
post '/api/accounting_periods',
|
|
{
|
|
accounting_period: {
|
|
start_at: start_at,
|
|
end_at: end_at
|
|
}
|
|
}.to_json, default_headers
|
|
|
|
# Check response format & status
|
|
assert_equal 422, response.status, response.body
|
|
assert_equal Mime::JSON, response.content_type
|
|
|
|
# check the error
|
|
assert_match(/#{I18n.t('errors.messages.cannot_overlap')}/, response.body)
|
|
end
|
|
end
|