Skip to content

Commit d9e162a

Browse files
committed
Tests.
1 parent b7592c4 commit d9e162a

File tree

6 files changed

+100
-5
lines changed

6 files changed

+100
-5
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717

1818
- uses: actions/setup-node@v4
1919
with:
20-
node-version: 23
20+
node-version: 20
2121
cache: "npm"
2222
- run: npm ci
2323

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ gem "http"
1111
group :test do
1212
gem "minitest"
1313
gem "webmock"
14+
gem "rack-test"
1415
end

Gemfile.lock

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ GEM
4444
rack-session (2.1.1)
4545
base64 (>= 0.1.0)
4646
rack (>= 3.0.0)
47+
rack-test (2.2.0)
48+
rack (>= 1.3)
4749
raindrops (0.20.1)
4850
rake (13.3.0)
4951
rexml (3.4.1)
@@ -73,6 +75,7 @@ DEPENDENCIES
7375
http
7476
minitest
7577
puma
78+
rack-test
7679
sd_notify
7780
sinatra
7881
unicorn

app/app.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,22 @@
66
require "base64"
77
require "connection_pool"
88

9-
set :protection, except: [:json_csrf]
9+
if ENV["RACK_ENV"] == "test"
10+
set :protection, false
11+
else
12+
set :protection, except: [:json_csrf]
13+
end
1014

1115
$parser = ConnectionPool.new(size: 1, timeout: 5) {
1216
HTTP.persistent(ENV["PARSER_URL"])
1317
}
1418

1519
def signature_valid?(user, signature, data)
16-
path = File.expand_path(File.join("..", "users", user), __dir__)
20+
if ENV["RACK_ENV"] == "test"
21+
path = File.join("users", user)
22+
else
23+
path = File.expand_path(File.join("..", "users", user), __dir__)
24+
end
1725
key = File.read(path).strip
1826
signature == OpenSSL::HMAC.hexdigest("sha1", key, data)
1927
end

test/app_test.rb

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,73 @@
1+
require "webmock/minitest"
12
require_relative "test_helper"
23

3-
class AppTest < Minitest::Test
4+
class AppTest < Test
5+
6+
def test_health_check
7+
get "/health_check"
8+
assert_equal 200, last_response.status
9+
assert_equal "OK", last_response.body
10+
end
11+
12+
def test_parser_with_valid_signature
13+
user = "testuser"
14+
url = "https://example.com"
15+
base64_url = Base64.urlsafe_encode64(url)
16+
key = "secret-key"
17+
signature = OpenSSL::HMAC.hexdigest("sha1", key, url)
18+
19+
response = JSON.dump({title: "Test Page"})
20+
21+
Dir.mktmpdir do |dir|
22+
users_dir = File.join(dir, "users")
23+
Dir.mkdir(users_dir)
24+
File.write(File.join(users_dir, user), key)
25+
26+
Dir.chdir(dir) do
27+
stub_request(:get, url)
28+
.to_return(
29+
status: 200,
30+
body: response,
31+
headers: {"Content-Type" => "application/json"}
32+
)
33+
34+
stub_request(:post, "#{ENV["PARSER_URL"]}/parser")
35+
.to_return(
36+
status: 200,
37+
body: response,
38+
headers: {"Content-Type" => "application/json"}
39+
)
40+
41+
get "/parser/#{user}/#{signature}?base64_url=#{base64_url}"
42+
43+
assert_equal 200, last_response.status
44+
assert_equal "application/json", last_response.content_type
45+
assert_equal JSON.load(response), JSON.load(last_response.body)
46+
end
47+
end
48+
end
49+
50+
def test_parser_with_invalid_signature
51+
user = "testuser"
52+
url = "https://example.com"
53+
base64_url = Base64.urlsafe_encode64(url)
54+
invalid_signature = "invalid"
55+
56+
Dir.mktmpdir do |dir|
57+
users_dir = File.join(dir, "users")
58+
Dir.mkdir(users_dir)
59+
File.write(File.join(users_dir, user), "secret-key")
60+
61+
Dir.chdir(dir) do
62+
get "/parser/#{user}/#{invalid_signature}?base64_url=#{base64_url}"
63+
64+
assert_equal 400, last_response.status
65+
assert_equal "application/json", last_response.content_type
66+
67+
body = JSON.parse(last_response.body)
68+
assert_equal true, body["error"]
69+
assert_equal "Invalid signature.", body["messages"]
70+
end
71+
end
72+
end
473
end

test/test_helper.rb

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
ENV["RACK_ENV"] = "test"
2+
ENV["PARSER_URL"] = "http://parser.test"
3+
14
require "minitest/autorun"
25
require "webmock/minitest"
3-
require_relative "../app/app.rb"
6+
require "rack/test"
7+
require "json"
8+
require "tmpdir"
9+
require_relative "../app/app.rb"
10+
11+
class Test < Minitest::Test
12+
include Rack::Test::Methods
13+
14+
def app
15+
Sinatra::Application
16+
end
17+
end

0 commit comments

Comments
 (0)