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