Skip to content

Commit 5d57dd5

Browse files
committed
test: 年次フィルタリング機能のテストスクリプトを追加
/statsと/dojosの数値の違いを検証するテストを実装: - /stats: sum(:counter) - 支部数の合計 - /dojos: 道場の個数 - 各道場は1回のみカウント テスト結果: - 全年度でテスト成功 - 差分は複数支部を持つ道場(大田・邑南など)によるもの - 無効な年のリダイレクトも正常動作 docs: 仕様の違いを明確に文書化
1 parent d58e5f4 commit 5d57dd5

File tree

2 files changed

+128
-0
lines changed

2 files changed

+128
-0
lines changed

docs/plan_download_yearly_stats.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
33
## 概要
44
CoderDojoの統計データを年次でダウンロードできる機能を実装する。`/dojos` ページにクエリパラメータ(`?year=2024`)を追加することで、特定年のデータや全年次統計をCSV/JSON形式でダウンロード可能にする。既存の `/stats` ページとの混乱を避けるため、`/dojos` エンドポイントを拡張する形で実装する。
55

6+
### ⚠️ 重要な仕様の違い
7+
- **/stats の累積合計**: `sum(:counter)` - 複数支部を持つ道場は支部数分カウント(例: counter=3なら3としてカウント)
8+
- **/dojos のリスト**: 道場の個数 - 1道場は1つとしてカウント(counterに関わらず)
9+
10+
これは意図的な仕様の違いです:
11+
- `/stats` は支部数の統計を表示
12+
- `/dojos` は道場のリストを表示(各道場は1回のみ)
13+
614
### データの取得範囲
715
- **yearパラメータなし(デフォルト)**:
816
- 全形式(HTML/JSON/CSV): 全道場(アクティブ + 非アクティブ)※既存の動作そのまま

script/test_yearly_dojos_count.rb

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
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

Comments
 (0)