require "./spec_helper"

describe "Session" do
  it "can establish a session" do
    sid = nil
    existing = nil
    get "/" do |env|
      sess = env.session
      existing = sess["token"]?
      sess.delete("token")
      sid = sess.id
      sess["token"] = "abc"
      "Hello"
    end

    # make first request without any cookies/session
    request = HTTP::Request.new("GET", "/")
    response = call_request_on_app(request)

    # verify we got a cookie and session ID
    cookie = response.headers["Set-Cookie"]?
    cookie.should_not be_nil
    response.cookies[Kemal.config.session["name"].as(String)].value.should eq(sid)
    lastsid = sid
    existing.should be_nil

    # make second request with cookies to get session
    request = HTTP::Request.new("GET", "/", response.headers)
    response = call_request_on_app(request)

    # verify we got cookies and we could see values set
    # in the previous request
    cookie2 = response.headers["Set-Cookie"]?
    cookie2.should_not be_nil
    cookie2.should eq(cookie)
    response.cookies[Kemal.config.session["name"].as(String)].value.should eq(lastsid)
    existing.should eq("abc")
  end

  it "can prune old sessions" do
    s = Kemal::Sessions::STORE
    s.clear

    Kemal::Sessions.prune!

    id = "foo"
    s[id] = Kemal::Sessions::Session.new(id)
    s.size.should eq(1)
    Kemal::Sessions.prune!
    s.size.should eq(1)

    s[id].last_access_at = (Time.now - 1.week).epoch_ms
    Kemal::Sessions.prune!
    s.size.should eq(0)
  end

  it "supports many types" do
    who = nil
    age = nil
    awesome = nil
    velocity = nil
    get "/" do |env|
      sess = env.session
      who = sess["who"]?
      age = sess["age"]?
      velocity = sess["velocity"]?
      awesome = sess["awesome"]?
      arr = sess["arr"]?
      sess["who"] = "Kemal"
      sess["age"] = 2016
      sess["velocity"] = 9999.9
      sess["awesome"] = true
      "Hello"
    end

    request = HTTP::Request.new("GET", "/")
    response = call_request_on_app(request)
    request = HTTP::Request.new("GET", "/", response.headers)
    response = call_request_on_app(request)

    who.should eq "Kemal"
    age.should eq 2016
    velocity.should eq 9999.9
    awesome.should eq true
  end
end