module AtCoderFriends::Scraping::CustomTest

run tests on custom_test page

Public Instance Methods

check_custom_test() click to toggle source
# File lib/at_coder_friends/scraping/custom_test.rb, line 37
def check_custom_test
  100.times do
    page = agent.get(contest_url('custom_test/json?reload=true'))
    data = JSON.parse(page.body)
    return nil unless data.is_a?(Hash) && data['Result']
    return data if data.dig('Result', 'Status') == 3
    return data unless data['Interval']

    sleep 1.0 * data['Interval'] / 1000
  end

  nil
end
code_test(infile) click to toggle source
# File lib/at_coder_friends/scraping/custom_test.rb, line 9
def code_test(infile)
  path, _dir, _prg, _base, ext, _q = ctx.path_info.components
  langs = lang_id(ext)
  src = File.read(path, encoding: Encoding::UTF_8)
  data = File.read(infile)

  post_custom_test(langs, src, data)
  check_custom_test
end
post_custom_test(langs, src, data) click to toggle source
# File lib/at_coder_friends/scraping/custom_test.rb, line 19
def post_custom_test(langs, src, data)
  page = fetch_with_auth(contest_url('custom_test'))
  lang = find_lang(page, langs)
  script = page.search('script').text
  csrf_token = script.scan(/var csrfToken = "(.*)"/)[0][0]

  page = agent.post(
    contest_url('custom_test/submit/json'),
    'data.LanguageId' => lang,
    'sourceCode' => src,
    'input' => data,
    'csrf_token' => csrf_token
  )

  msg = page.body
  raise AppError, msg unless msg.empty?
end