FactoryBot.define do
  factory :coffee_script, class: ExecutionEnvironment do
    created_by_teacher
    default_memory_limit
    docker_image 'hklement/ubuntu-coffee:latest'
    association :file_type, factory: :dot_coffee
    help
    name 'CoffeeScript'
    network_enabled false
    permitted_execution_time 10.seconds
    pool_size 0
    run_command 'coffee'
    singleton_execution_environment
  end

  factory :html, class: ExecutionEnvironment do
    created_by_teacher
    default_memory_limit
    docker_image 'hklement/ubuntu-html:latest'
    association :file_type, factory: :dot_html
    help
    name 'HTML5'
    network_enabled false
    permitted_execution_time 10.seconds
    pool_size 0
    run_command 'touch'
    singleton_execution_environment
    test_command 'rspec %{filename} --format documentation'
    testing_framework 'RspecAdapter'
  end

  factory :java, class: ExecutionEnvironment do
    created_by_teacher
    default_memory_limit
    docker_image 'openhpi/co_execenv_java:latest'
    association :file_type, factory: :dot_java
    help
    name 'Java 8'
    network_enabled false
    permitted_execution_time 10.seconds
    pool_size 0
    run_command 'make run'
    singleton_execution_environment
    test_command 'make test CLASS_NAME="%{class_name}" FILENAME="%{filename}"'
    testing_framework 'JunitAdapter'
  end

  factory :jruby, class: ExecutionEnvironment do
    created_by_teacher
    default_memory_limit
    docker_image 'hklement/ubuntu-jruby:latest'
    association :file_type, factory: :dot_rb
    help
    name 'JRuby 1.7'
    network_enabled false
    permitted_execution_time 10.seconds
    pool_size 0
    run_command 'jruby %{filename}'
    singleton_execution_environment
    test_command 'rspec %{filename} --format documentation'
    testing_framework 'RspecAdapter'
  end

  factory :node_js, class: ExecutionEnvironment do
    created_by_teacher
    default_memory_limit
    docker_image 'hklement/ubuntu-node:latest'
    association :file_type, factory: :dot_js
    help
    name 'Node.js'
    network_enabled false
    permitted_execution_time 10.seconds
    pool_size 0
    run_command 'node %{filename}'
    singleton_execution_environment
  end

  factory :python, class: ExecutionEnvironment do
    created_by_teacher
    default_memory_limit
    docker_image 'openhpi/co_execenv_python:latest'
    association :file_type, factory: :dot_py
    help
    name 'Python 3.4'
    network_enabled false
    permitted_execution_time 10.seconds
    pool_size 0
    run_command 'python3 %{filename}'
    singleton_execution_environment
    test_command 'python3 -m unittest --verbose %{module_name}'
    testing_framework 'PyUnitAdapter'
  end

  factory :ruby, class: ExecutionEnvironment do
    created_by_teacher
    default_memory_limit
    docker_image 'hklement/ubuntu-ruby:latest'
    association :file_type, factory: :dot_rb
    help
    name 'Ruby 2.2'
    network_enabled false
    permitted_execution_time 10.seconds
    pool_size 0
    run_command 'ruby %{filename}'
    singleton_execution_environment
    test_command 'rspec %{filename} --format documentation'
    testing_framework 'RspecAdapter'
  end

  factory :sinatra, class: ExecutionEnvironment do
    created_by_teacher
    default_memory_limit
    docker_image 'hklement/ubuntu-sinatra:latest'
    association :file_type, factory: :dot_rb
    exposed_ports '4567'
    help
    name 'Sinatra'
    network_enabled true
    permitted_execution_time 15.minutes
    pool_size 0
    run_command 'ruby %{filename}'
    singleton_execution_environment
    test_command 'rspec %{filename} --format documentation'
    testing_framework 'RspecAdapter'
  end

  factory :sqlite, class: ExecutionEnvironment do
    created_by_teacher
    default_memory_limit
    docker_image 'hklement/ubuntu-sqlite:latest'
    association :file_type, factory: :dot_sql
    help
    name 'SQLite'
    network_enabled false
    permitted_execution_time 1.minute
    pool_size 0
    run_command 'sqlite3 /database.db -init %{filename} -html'
    singleton_execution_environment
    test_command 'ruby %{filename}'
    testing_framework 'SqlResultSetComparatorAdapter'
  end

  trait :default_memory_limit do
    memory_limit DockerClient::DEFAULT_MEMORY_LIMIT
  end

  trait :help do
    help { Forgery(:lorem_ipsum).words(Forgery(:basic).number(at_least: 50, at_most: 100)) }
  end

  trait :singleton_execution_environment do
    initialize_with { ExecutionEnvironment.where(name: name).first_or_create }
  end
end
