File: spec_session_abstract_persisted.rb

package info (click to toggle)
ruby-rack-session 2.1.1-0.1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 312 kB
  • sloc: ruby: 1,885; makefile: 4
file content (95 lines) | stat: -rw-r--r-- 3,004 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2022-2023, by Samuel Williams.

require_relative 'helper'
require 'rack/request'

require "rack/session/abstract/id"

describe Rack::Session::Abstract::Persisted do
  def setup
    @class = Rack::Session::Abstract::Persisted
    @pers = @class.new(nil)
  end

  it "#generated_sid generates a session identifier" do
    @pers.send(:generate_sid).must_match(/\A\h+\z/)
    @pers.send(:generate_sid, nil).must_match(/\A\h+\z/)

    obj = Object.new
    def obj.hex(_); raise NotImplementedError end
    @pers.send(:generate_sid, obj).must_match(/\A\h+\z/)
  end

  it "#commit_session? returns false if :skip option is given" do
    @pers.send(:commit_session?, Rack::Request.new({}), {}, skip: true).must_equal false
  end

  it "#commit_session writes to rack.errors if session cannot be written" do
    @pers = @class.new(nil)
    def @pers.write_session(*) end
    errors = StringIO.new
    env = { 'rack.errors' => errors }
    req = Rack::Request.new(env)
    store = Class.new do
      def load_session(req)
        ["id", {}]
      end
      def session_exists?(req)
        true
      end
    end
    session = env['rack.session'] = Rack::Session::Abstract::SessionHash.new(store.new, req)
    session['foo'] = 'bar'
    @pers.send(:commit_session, req, Rack::Response.new)
    errors.rewind
    errors.read.must_equal "Warning! Rack::Session::Abstract::Persisted failed to save session. Content dropped.\n"
  end

  it "#cookie_value returns its argument" do
    obj = Object.new
    @pers.send(:cookie_value, obj).must_equal(obj)
  end

  it "#session_class returns the default session class" do
    @pers.send(:session_class).must_equal Rack::Session::Abstract::SessionHash
  end

  it "#find_session raises" do
    proc { @pers.send(:find_session, nil, nil) }.must_raise RuntimeError
  end

  it "#write_session raises" do
    proc { @pers.send(:write_session, nil, nil, nil, nil) }.must_raise RuntimeError
  end

  it "#delete_session raises" do
    proc { @pers.send(:delete_session, nil, nil, nil) }.must_raise RuntimeError
  end

  describe '#security_matches?' do

    it '#security_matches? returns true if secure cookie is off' do
      @pers.send(:security_matches?, Rack::Request.new({}), {}).must_equal true
    end

    it '#security_matches? returns true if ssl is on' do
      req = Rack::Request.new({})
      req.set_header('HTTPS', 'on')
      @pers.send(:security_matches?, req, { secure: true }).must_equal true
    end

    it '#security_matches? returns true if assume_ssl option is set' do
      req = Rack::Request.new({})
      pers_with_persist = @class.new(nil, { assume_ssl: true })
      pers_with_persist.send(:security_matches?, req, { secure: true }).must_equal true
    end

    it '#security_matches? returns false if secure cookie is on, but not ssl or assume_ssl' do
      @pers.send(:security_matches?, Rack::Request.new({}), { secure: true }).must_equal false
    end

  end
end