summaryrefslogtreecommitdiff
path: root/test/rubygems/test_webauthn_listener_response.rb
blob: b3e54e0f19252620f163aac047e2ba96eb0e746b (plain)
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# frozen_string_literal: true

require_relative "helper"
require "rubygems/webauthn_listener/response/response_ok"
require "rubygems/webauthn_listener/response/response_no_content"
require "rubygems/webauthn_listener/response/response_bad_request"
require "rubygems/webauthn_listener/response/response_not_found"
require "rubygems/webauthn_listener/response/response_method_not_allowed"

class WebauthnListenerResponseTest < Gem::TestCase
  class MockResponse < Gem::WebauthnListener::Response
    def payload
      "hello world"
    end
  end

  def setup
    super
    @host = "rubygems.example"
  end

  def test_ok_response_payload
    payload = Gem::WebauthnListener::ResponseOk.new(@host).payload

    expected_payload = <<~RESPONSE
      HTTP/1.1 200 OK
      Connection: close
      Access-Control-Allow-Origin: rubygems.example
      Access-Control-Allow-Methods: POST
      Access-Control-Allow-Headers: Content-Type, Authorization, x-csrf-token
      Content-Type: text/plain
      Content-Length: 7

      success
    RESPONSE

    assert_equal expected_payload, payload
  end

  def test_no_payload_response_payload
    payload = Gem::WebauthnListener::ResponseNoContent.new(@host).payload

    expected_payload = <<~RESPONSE
      HTTP/1.1 204 No Content
      Connection: close
      Access-Control-Allow-Origin: rubygems.example
      Access-Control-Allow-Methods: POST
      Access-Control-Allow-Headers: Content-Type, Authorization, x-csrf-token
    RESPONSE

    assert_equal expected_payload, payload
  end

  def test_method_not_allowed_response_payload
    payload = Gem::WebauthnListener::ResponseMethodNotAllowed.new(@host).payload

    expected_payload = <<~RESPONSE
      HTTP/1.1 405 Method Not Allowed
      Connection: close
      Access-Control-Allow-Origin: rubygems.example
      Access-Control-Allow-Methods: POST
      Access-Control-Allow-Headers: Content-Type, Authorization, x-csrf-token
      Allow: GET, OPTIONS
    RESPONSE

    assert_equal expected_payload, payload
  end

  def test_method_not_found_response_payload
    payload = Gem::WebauthnListener::ResponseNotFound.new(@host).payload

    expected_payload = <<~RESPONSE
      HTTP/1.1 404 Not Found
      Connection: close
      Access-Control-Allow-Origin: rubygems.example
      Access-Control-Allow-Methods: POST
      Access-Control-Allow-Headers: Content-Type, Authorization, x-csrf-token
    RESPONSE

    assert_equal expected_payload, payload
  end

  def test_bad_request_response_payload
    payload = Gem::WebauthnListener::ResponseBadRequest.new(@host).payload

    expected_payload = <<~RESPONSE
      HTTP/1.1 400 Bad Request
      Connection: close
      Access-Control-Allow-Origin: rubygems.example
      Access-Control-Allow-Methods: POST
      Access-Control-Allow-Headers: Content-Type, Authorization, x-csrf-token
      Content-Type: text/plain
      Content-Length: 22

      missing code parameter
    RESPONSE

    assert_equal expected_payload, payload
  end

  def test_send_response
    server = TCPServer.new "localhost", 5678
    thread = Thread.new do
      receive_socket = server.accept
      Thread.current[:payload] = receive_socket.read
      receive_socket.close
    end

    send_socket = TCPSocket.new "localhost", 5678
    MockResponse.send(send_socket, @host)

    thread.join
    assert_equal "hello world", thread[:payload]
    assert_predicate send_socket, :closed?
  end
end