#!/usr/bin/ruby

require 'mechanize'
require 'open-uri'
require 'shellwords'

def run_cron(faketime_modifier)
  File.open('/etc/cron.d/coquelicot') do |f|
    f.each_line do |line|
      match = /\s*(?:[^\s]\s+){5}coquelicot (.*)$/.match(line)
      next unless match
      system 'su', 'coquelicot', '-s', '/bin/sh', '-c', "env NO_FAKE_STAT=1 faketime -f '#{faketime_modifier}' sh -c #{Shellwords.escape(match[1])}"
      raise "Cron failed with #{$?}" unless $? == 0
    end
  end
end

def assert_url_status(url, expected_status)
  status = nil
  begin
    open(url) { |f| status = f.status }
  rescue OpenURI::HTTPError => ex
    status = ex.io.status
  end
  raise "Status #{status} is not #{expected_status}" unless status.first.to_i == expected_status
end

initial_storage_file_count = Dir.entries('/var/lib/coquelicot').size

agent = Mechanize.new

upload_page = agent.get('http://127.0.0.1:51161')
upload_form = upload_page.forms.first
upload_form.field_with(:name => 'upload_password').value = 'test'
upload_form.field_with(:name => 'expire').value = '60' # one hour
upload_form.file_uploads.first.file_name = __FILE__

ready_page = agent.submit(upload_form)
download_url = ready_page.search('.ready').text

raise "Same number of files in storage" if Dir.entries('/var/lib/coquelicot').size <= initial_storage_file_count

assert_url_status(download_url, 200)
run_cron('+2h')
assert_url_status(download_url, 410)
run_cron('+10d')
assert_url_status(download_url, 404)

raise "Extra files storage" if Dir.entries('/var/lib/coquelicot').size > initial_storage_file_count
