# ====================================================================
# integration tests run against rails with HTTP requests
# and can analyse the returned html.  javascript is not included.
# integration tests are fast.
# ====================================================================
# this is a first, very basic version, of test/integration/job_flow_test.rb


require 'test_helper'

class JobFlowTest < ActionDispatch::IntegrationTest
  test "visiting the index" do
    get jobs_url
    assert_response :success
    assert_select "h1", text: "RailsBridgeCorp Open Jobs"
  end
  
  test "visiting the new job form" do
    get new_job_url
    assert_response :success
    assert_select "h1", text: "Add a job"
  end  
  

  test "can create a new job" do
    assert_difference "Job.count", 1 do    
      post jobs_url,
        params: { job: { title: "security expert", description: "use apis without forms." } }
      assert_response :redirect
    end
  end 

  test "visiting the index shows all the jobs" do
    j = jobs(:one) # created by fixture - don't forget to set up a fixture file (see below)
    get jobs_url
    assert_response :success
    assert_select "h3", text: j.title
  end  
  
  test "nav bar is present" do
    get jobs_url
    assert_response :success
    assert_select "a", text: "Add Job"
    assert_select "a", text: "Home"  
  end   


  test "visiting the edit job form" do
    j = jobs(:one)    
    get edit_job_url(j.id)
    assert_response :success
    assert_select "h1", text: "Edit Posting"
    assert_select "label", text: "Description"
    assert_select "input", value: j.description
  end

  test "can edit an existing job" do
    j = jobs(:one)    
    new_title = "dark hat hacker"
    patch "/jobs/#{j.id}",
      params: { job: { title: new_title, description: j.description } }
    assert_response :redirect
    j = Job.find(j.id)
    assert_equal new_title, j.title
  end    
  
  test "can delete job" do
    j = jobs(:one) 
    assert_difference "Job.count", -1 do    
      delete "/jobs/#{j.id}"
      assert_response :redirect
    end
  end    
  
end




# ====================================================================
# this is file test/models/job_test.rb

require 'test_helper'

class JobTest < ActiveSupport::TestCase
  test "can create and save a job" do
    j = Job.new
    assert j.save
  end
end



# ====================================================================
# this is file test/fixtures/jobs.yml


one:
  title: Frontend Developer
  description: makes pretty things. handles ie6.

two:
  title: Backend Developer
  description: makes invisible things. no ie6.



# ====================================================================
# system tests re used to test the browser / javascript also.
# ====================================================================
# this is a first, very basic version, of test/system/jobs_test.rb

require "application_system_test_case"

class JobsTest < ApplicationSystemTestCase

  test "visiting the index" do
    visit jobs_url
    assert_selector "h1", text: "RailsBridgeCorp Open Jobs"
  end

end



# ====================================================================
# these is a more elaborate version of test/system/jobs_test.rb
# don't copy all of it at once!

require "application_system_test_case"

class JobsTest < ApplicationSystemTestCase
  setup do
    @job = jobs(:one)
  end

  test "visiting the index" do
    visit jobs_url
    assert_selector "h1", text: "RailsBridgeCorp Open Jobs"
  end

  test "creating a Job" do
    visit jobs_url
    click_on "New Job"

    fill_in "Description", with: @job.description
    fill_in "Title", with: @job.title
    click_on "Create Job"

    assert_text "Job was successfully created"
    click_on "Back"
  end

  test "updating a Job" do
    visit jobs_url
    click_on "Edit", match: :first

    fill_in "Description", with: @job.description
    fill_in "Title", with: @job.title
    click_on "Update Job"

    assert_text "Job was successfully updated"
    click_on "Back"
  end

  test "destroying a Job" do
    visit jobs_url
    page.accept_confirm do
      click_on "Destroy", match: :first
    end

    assert_text "Job was successfully destroyed"
  end
end


# this is file test/fixtures/jobs.yml

one:
  title: Frontend Developer
  description: do pretty things, handle ie6

two:
  title: Backend Developer
  description: do invisibile things, no ie6