1+ #!/usr/bin/env ruby
2+ require 'net/http'
3+ require 'json'
4+ require 'uri'
5+
6+ # 統計ページの累積合計データ(/statsから取得)
7+ # これはsum(:counter)の値(支部数の合計)
8+ STATS_COUNTER_TOTALS = {
9+ 2012 => 5 ,
10+ 2013 => 7 ,
11+ 2014 => 17 ,
12+ 2015 => 22 ,
13+ 2016 => 63 ,
14+ 2017 => 118 ,
15+ 2018 => 172 ,
16+ 2019 => 200 ,
17+ 2020 => 222 ,
18+ 2021 => 236 ,
19+ 2022 => 225 ,
20+ 2023 => 199 ,
21+ 2024 => 206
22+ }
23+
24+ BASE_URL = 'http://localhost:3000'
25+
26+ def fetch_dojos_count ( year )
27+ uri = URI ( "#{ BASE_URL } /dojos.json?year=#{ year } " )
28+ response = Net ::HTTP . get_response ( uri )
29+
30+ if response . code == '200'
31+ JSON . parse ( response . body ) . length
32+ else
33+ nil
34+ end
35+ end
36+
37+ def test_invalid_years
38+ puts "\n 📍 無効な年のテスト:"
39+
40+ # 範囲外の年
41+ [ 2011 , 2026 ] . each do |year |
42+ uri = URI ( "#{ BASE_URL } /dojos.json?year=#{ year } " )
43+ response = Net ::HTTP . get_response ( uri )
44+
45+ # HTMLページへのリダイレクトを期待(302 Found)
46+ if response . code == '302' || response . code == '303'
47+ puts " ✅ #{ year } 年: リダイレクト (#{ response . code } )"
48+ else
49+ puts " ❌ #{ year } 年: 予期しないレスポンス (#{ response . code } )"
50+ end
51+ end
52+
53+ # 文字列の年
54+ uri = URI ( "#{ BASE_URL } /dojos.json?year=invalid" )
55+ response = Net ::HTTP . get_response ( uri )
56+ if response . code == '302' || response . code == '303'
57+ puts " ✅ 'invalid': リダイレクト (#{ response . code } )"
58+ else
59+ puts " ❌ 'invalid': 予期しないレスポンス (#{ response . code } )"
60+ end
61+ end
62+
63+ def main
64+ puts "🧪 道場数年次フィルタリングのテスト"
65+ puts "=" * 50
66+
67+ all_passed = true
68+
69+ puts "\n 📊 各年のアクティブ道場数の検証:"
70+ puts "※ /dojos は道場リスト(道場数)、/stats は支部数合計(counter合計)を返します"
71+ puts "\n 年 | /stats | /dojos | 差分 | 説明"
72+ puts "-" * 50
73+
74+ STATS_COUNTER_TOTALS . each do |year , stats_total |
75+ dojos_count = fetch_dojos_count ( year )
76+
77+ if dojos_count . nil?
78+ puts "#{ year } | #{ stats_total . to_s . rjust ( 6 ) } | ERROR | | ❌ 取得失敗"
79+ all_passed = false
80+ else
81+ diff = stats_total - dojos_count
82+ status = diff >= 0 ? "✅" : "❌"
83+ puts "#{ year } | #{ stats_total . to_s . rjust ( 6 ) } | #{ dojos_count . to_s . rjust ( 6 ) } | #{ diff . to_s . rjust ( 5 ) } | #{ status } #{ diff > 0 ? "複数支部あり" : "" } "
84+ end
85+ end
86+
87+ # 無効な年のテスト
88+ test_invalid_years
89+
90+ # yearパラメータなしの場合
91+ puts "\n 📍 yearパラメータなしのテスト:"
92+ uri = URI ( "#{ BASE_URL } /dojos.json" )
93+ response = Net ::HTTP . get_response ( uri )
94+ if response . code == '200'
95+ total_count = JSON . parse ( response . body ) . length
96+ puts " 全道場数: #{ total_count } 個"
97+
98+ # 全道場数は2024年の道場数よりも多いはず(非アクティブ含むため)
99+ dojos_2024 = fetch_dojos_count ( 2024 )
100+ if total_count >= dojos_2024
101+ puts " ✅ 全道場数(#{ total_count } ) >= 2024年アクティブ道場数(#{ dojos_2024 } )"
102+ else
103+ puts " ❌ データ不整合: 全道場数が2024年アクティブ数より少ない"
104+ all_passed = false
105+ end
106+ else
107+ puts " ❌ 取得失敗"
108+ all_passed = false
109+ end
110+
111+ puts "\n " + "=" * 50
112+ if all_passed
113+ puts "✅ すべてのテストが成功しました!"
114+ else
115+ puts "❌ 一部のテストが失敗しました"
116+ exit 1
117+ end
118+ end
119+
120+ main if __FILE__ == $0
0 commit comments