Ctrl K
ComunidadGuías…

test/controllers/sessions_controller_test.rb

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# frozen_string_literal: true

require "test_helper"

class SessionsControllerTest < ActionDispatch::IntegrationTest
  SAFARI_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15"

  setup do
    @user = users(:visitor1)
    @admin = users(:admin)

    Current.ip_address = "10.0.0.9"
    Current.user_agent = SAFARI_USER_AGENT

    @visitor_session = users(:visitor2).sessions.create!
  end

  test "should get new session" do
    get new_session_url
    assert_response :success
  end

  test "should redirect to root when user logged in" do
    login users(:visitor1)
    get new_session_url

    assert_redirected_to root_url
  end

  test "should create session" do
    post sessions_url, params: { session: { email: @user.email, password: "foobar" } }

    assert_redirected_to root_url
    assert_not_empty cookies[:session_id]
    assert_not_empty @user.sessions
  end

  test "should has error flash when failed to create session" do
    post sessions_url, params: { session: { email: @user.email, password: "fake" } }
    assert flash[:alert].present?
    assert_empty @user.sessions
  end


  test "should create session via api" do
    post sessions_url, as: :json, params: {
      session: {
        email: @user.email,
        password: "foobar"
      }
    }

    response = @response.parsed_body["user"]

    assert_response :success
    assert_not_empty cookies[:session_id]
    assert_not_empty @user.sessions
    assert_not_empty response["api_token"]
    assert_equal @user.id, response["id"]
    assert_equal @user.email, response["email"]
    assert_equal @user.is_admin, response["is_admin"]
  end

  test "should not create session via api with wrong credential" do
    post sessions_url, as: :json, params: {
      session: {
        email: "fake@email.com",
        password: "fake"
      }
    }

    assert_response :unauthorized
    assert_nil cookies[:session_id]
    assert_empty @user.sessions
  end

  test "should get error message via api with wrong credential" do
    post sessions_url, as: :json, params: {
      session: {
        email: "fake@email.com",
        password: "fake"
      }
    }

    response = @response.parsed_body

    assert_response :unauthorized
    assert_equal "InvalidCredential", response["type"]
    assert_not_empty response["message"]
  end

  test "should get index" do
    login @admin
    get sessions_url

    assert_response :success
  end

  test "should revoke session" do
    login @admin

    assert_difference -> { Session.count }, -1 do
      delete session_url(@visitor_session)
    end

    assert_redirected_to sessions_url
    assert_not Session.exists?(@visitor_session.id)
  end

  test "should not revoke current session" do
    login @admin
    current_session = @admin.sessions.last

    delete session_url(current_session)

    assert_response :forbidden
    assert Session.exists?(current_session.id)
  end

  test "should only admin can access" do
    login

    get sessions_url
    assert_response :forbidden

    delete session_url(@visitor_session)
    assert_response :forbidden
  end

  test "should not let user access when is on demo mode" do
    with_env("DEMO_MODE" => "true") do
      login @admin

      get sessions_url
      assert_response :forbidden

      delete session_url(@visitor_session)
      assert_response :forbidden
    end
  end

  test "should get index via api" do
    get sessions_url, as: :json, headers: api_token_header(@admin)
    response = @response.parsed_body

    assert_response :success

    visitor_session_response = response.find { |item| item["id"] == @visitor_session.id }

    assert_equal users(:visitor2).id, visitor_session_response["user_id"]
    assert_equal users(:visitor2).email, visitor_session_response["email"]
    assert_equal "10.0.0.9", visitor_session_response["ip_address"]
    assert_equal SAFARI_USER_AGENT, visitor_session_response["user_agent"]
    assert_not visitor_session_response["is_current"]

    assert response.find { |item| item["id"] == @admin.sessions.last.id }["is_current"]
  end

  test "should put current session on the top of index via api" do
    headers = api_token_header(@admin)
    current_session = @admin.sessions.last
    current_session.update_column(:created_at, 1.day.ago)
    users(:visitor1).sessions.create!

    get sessions_url, as: :json, headers: headers

    assert_equal current_session.id, @response.parsed_body.first["id"]
  end

  test "should revoke session via api" do
    headers = api_token_header(@admin)

    assert_difference -> { Session.count }, -1 do
      delete session_url(@visitor_session), as: :json, headers: headers
    end

    assert_response :no_content
  end

  test "should not revoke current session via api" do
    headers = api_token_header(@admin)
    current_session = @admin.sessions.last

    delete session_url(current_session), as: :json, headers: headers

    assert_response :forbidden
    assert_equal "Forbidden", @response.parsed_body["type"]
    assert Session.exists?(current_session.id)
  end

  test "should not let non-admin user access via api" do
    get sessions_url, as: :json, headers: api_token_header(@user)
    assert_response :forbidden

    delete session_url(@visitor_session), as: :json, headers: api_token_header(@user)
    assert_response :forbidden
  end
end