summaryrefslogtreecommitdiff
path: root/test/unit/nickserver_test.rb
blob: 65ade8cccbf9d7a81b53bcdbcc69cb978663adee (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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
require File.expand_path('test_helper', File.dirname(__FILE__))
require 'json'

#
# Some important notes to understanding these tests:
#
# (1) Requests to localhost always bypass HTTP stub.
#
# (2) All requests to nickserver are to localhost.
#
# (3) the "Host" header for requests to nickserver must be set (or Config.domain set)
#
# (4) When stubbing requests to couchdb, the couchdb host is changed from the
# default (localhost) to a dummy value (notlocalhost).
#

class NickserverTest < Minitest::Test

  def test_GET_served_via_SKS
    uid    = 'cloudadmin@leap.se'
    key_id = 'E818C478D3141282F7590D29D041EB11B1647490'
    stub_sks_vindex_reponse(uid, body: file_content(:leap_vindex_result))
    stub_sks_get_reponse(key_id, body: file_content(:leap_public_key))

    start do
      params = {query: {"address" => uid}}
      get(params) do |http|
        assert_equal file_content(:leap_public_key), JSON.parse(http.response)["openpgp"]
        stop
      end
    end
  end

  def test_POST_served_via_SKS
    uid    = 'cloudadmin@leap.se'
    key_id = 'E818C478D3141282F7590D29D041EB11B1647490'
    stub_sks_vindex_reponse(uid, body: file_content(:leap_vindex_result))
    stub_sks_get_reponse(key_id, body: file_content(:leap_public_key))

    start do
      params = {body: {"address" => uid}}
      post(params) do |http|
        assert_equal file_content(:leap_public_key), JSON.parse(http.response)["openpgp"]
        stop
      end
    end
  end

  def test_GET_served_via_couch_not_found
    domain = "example.org"
    uid    = "bananas@" + domain
    stub_couch_response(uid, status: 404) do
      start do
        params = {query: {"address" => uid}, head: {host: domain}}
        get(params) do |http|
          assert_equal 404, http.response_header.status
          stop
        end
      end
    end
  end

  def test_GET_served_via_couch_empty_results
    domain = "example.org"
    uid    = "stompy@" + domain
    stub_couch_response(uid, body: file_content(:empty_couchdb_result)) do
      start do
        params = {query: {"address" => uid}, head: {host: domain}}
        get(params) do |http|
          assert_equal 404, http.response_header.status
          stop
        end
      end
    end
  end

  def test_GET_served_via_couch_success
    domain = "example.org"
    uid    = "blue@" + domain
    stub_couch_response(uid, body: file_content(:blue_couchdb_result)) do
      start do
        params = {query: {"address" => uid}, head: {host: domain}}
        get(params) do |http|
          assert_equal file_content(:blue_nickserver_result), http.response
          stop
        end
      end
    end
  end

  def test_GET_empty
    start do
      get({}) do |http|
        assert_equal "404 Not Found\n", http.response
        stop
      end
    end
  end

  protected

  #
  # start nickserver
  #
  def start(timeout = 1)
    Timeout::timeout(timeout) do
      EM.run do
        Nickserver::Server.start
        EM.epoll
        yield
      end
    end
  rescue Timeout::Error
    flunk 'EventMachine was not stopped before the timeout expired'
  end

  #
  # http GET requests to nickserver
  #
  def get(params, &block)
    request(:get, params, &block)
  end

  #
  # http POST requests to nickserver
  #
  def post(params, &block)
    request(:post, params, &block)
  end

  #
  # http request to nickserver
  #
  # this works because http requests to localhost are not stubbed, but requests to other domains are.
  #
  def request(method, params)
    EventMachine::HttpRequest.new("http://localhost:#{Nickserver::Config.port}/").send(method,params).callback {|http|
      # p http.response_header.status
      # p http.response_header
      # p http.response
      yield http
    }.errback {|http|
      flunk(http.error) if http.error
      EM.stop
    }
  end

  #
  # stop nickserver
  #
  def stop
    EM.stop
  end

end