-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_stats_dashboard.py
More file actions
230 lines (170 loc) · 8.2 KB
/
Copy pathtest_stats_dashboard.py
File metadata and controls
230 lines (170 loc) · 8.2 KB
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
"""Validation tests for StatsDashboardScreen.kt, AppNavigation.kt updates, and COORDINATION.md."""
import re
import pytest
STATS_FILE = "ui/StatsDashboardScreen.kt"
NAV_FILE = "ui/AppNavigation.kt"
COORD_FILE = "COORDINATION.md"
def read(path):
with open(path, "r") as f:
return f.read()
# ─── StatsDashboardScreen.kt Tests ─────────────────────────────────────────────
class TestStatsDashboardScreen:
@pytest.fixture(autouse=True)
def load(self):
self.src = read(STATS_FILE)
def test_package_declaration(self):
assert "package com.discordbotmaker.android.ui.stats" in self.src
def test_imports_appcolors(self):
assert "import com.discordbotmaker.android.ui.theme.AppColors" in self.src
def test_no_inline_hex_colors(self):
# Find Color(0x...) patterns that are NOT inside AppColors/AppTheme
# The file should only reference AppColors.* for colors
hex_colors = re.findall(r'Color\(0x[0-9A-Fa-f]+\)', self.src)
assert len(hex_colors) == 0, f"Found inline hex colors: {hex_colors}"
def test_no_monospace_font(self):
assert "FontFamily.Monospace" not in self.src
def test_uses_sans_serif(self):
assert "FontFamily.SansSerif" not in self.src or True # SansSerif not needed if using Material defaults
# More importantly, no Monospace
assert "Monospace" not in self.src
def test_card_elevation_zero(self):
# All CardDefaults.cardElevation should use 0.dp
elevations = re.findall(r'cardElevation\((.*?)\)', self.src)
for e in elevations:
assert "0.dp" in e or "defaultElevation = 0.dp" in e, f"Non-zero elevation: {e}"
def test_card_corners_8dp(self):
corners = re.findall(r'RoundedCornerShape\((\d+)\.dp\)', self.src)
for c in corners:
assert c == "8" or c == "2", f"Non-8dp corner found: {c}dp (2dp for accent bars is OK)"
def test_header_tonal_elevation_zero(self):
assert "tonalElevation = 0.dp" in self.src
def test_bot_stats_data_class(self):
assert "data class BotStats" in self.src
assert "totalServers" in self.src
assert "totalUsers" in self.src
assert "activeCommands" in self.src
assert "uptimeFormatted" in self.src
def test_activity_data_point_class(self):
assert "data class ActivityDataPoint" in self.src
assert "label" in self.src
assert "value" in self.src
def test_composable_screen_function(self):
assert "@Composable" in self.src
assert "fun StatsDashboardScreen" in self.src
def test_stat_cards_present(self):
assert "Total Servers" in self.src
assert "Total Users" in self.src
assert "Active Commands" in self.src
assert "Uptime" in self.src
def test_canvas_chart(self):
assert "Canvas" in self.src
assert "import androidx.compose.foundation.Canvas" in self.src
def test_chart_uses_path(self):
assert "Path()" in self.src
assert "drawPath" in self.src
def test_chart_uses_drawline_for_grid(self):
assert "drawLine" in self.src
def test_chart_data_dots(self):
assert "drawCircle" in self.src
def test_chart_animation(self):
assert "Animatable" in self.src
assert "animateTo" in self.src
def test_uses_appcolors_primary(self):
assert "AppColors.Primary" in self.src
def test_uses_appcolors_surface(self):
assert "AppColors.Surface" in self.src
def test_uses_appcolors_background(self):
assert "AppColors.Background" in self.src
def test_uses_appcolors_success(self):
assert "AppColors.Success" in self.src
def test_uses_appcolors_warning(self):
assert "AppColors.Warning" in self.src
def test_uses_input_background(self):
assert "AppColors.InputBackground" in self.src
def test_summary_card_present(self):
assert "Quick Summary" in self.src
def test_format_number_helper(self):
assert "formatNumber" in self.src
def test_default_activity_data(self):
assert "defaultActivityData" in self.src
# Should have weekday labels
assert "Mon" in self.src
assert "Sun" in self.src
def test_chart_legend(self):
assert "Commands Executed" in self.src
def test_x_axis_labels(self):
assert "X-axis labels" in self.src or "dp.label" in self.src
def test_fill_area_under_curve(self):
assert "fillPath" in self.src
def test_stroke_styling(self):
assert "StrokeCap.Round" in self.src
assert "StrokeJoin.Round" in self.src
# ─── AppNavigation.kt Tests ────────────────────────────────────────────────────
class TestAppNavigation:
@pytest.fixture(autouse=True)
def load(self):
self.src = read(NAV_FILE)
def test_imports_stats_screen(self):
assert "import com.discordbotmaker.android.ui.stats.StatsDashboardScreen" in self.src
def test_stats_route_constant(self):
assert 'STATS_DASHBOARD' in self.src
assert '"stats_dashboard"' in self.src
def test_stats_composable_route(self):
assert "composable(AppRoutes.STATS_DASHBOARD)" in self.src
def test_stats_screen_invocation(self):
assert "StatsDashboardScreen()" in self.src
def test_existing_routes_preserved(self):
assert "AppRoutes.DASHBOARD" in self.src
assert "AppRoutes.LIVE_CONSOLE" in self.src
assert "AppRoutes.AUTO_MOD" in self.src
assert "AppRoutes.COMMAND_BUILDER" in self.src
assert "AppRoutes.BOT_CREATION" in self.src
def test_existing_imports_preserved(self):
assert "import com.discordbotmaker.android.ui.automod.AutoModScreen" in self.src
assert "import com.discordbotmaker.android.ui.dashboard.MainDashboardScreen" in self.src
assert "import com.discordbotmaker.android.ui.launch.BotCreationScreen" in self.src
def test_nav_host_start_destination(self):
assert "startDestination = AppRoutes.DASHBOARD" in self.src
# ─── COORDINATION.md Tests ─────────────────────────────────────────────────────
class TestCoordinationMd:
@pytest.fixture(autouse=True)
def load(self):
self.src = read(COORD_FILE)
def test_migration_status_section(self):
assert "## Migration Status" in self.src
def test_migration_mentions_org_permissions(self):
assert "org" in self.src.lower() and "permission" in self.src.lower()
def test_migration_mentions_pending(self):
assert "pending" in self.src.lower() or "waiting" in self.src.lower()
def test_migration_mentions_personal_fork(self):
assert "Shin5hi/discord-bot-maker-android" in self.src
def test_stats_module_section(self):
assert "Stats Dashboard Module" in self.src
def test_stats_file_ownership(self):
assert "ui/StatsDashboardScreen.kt" in self.src
def test_stats_route_documented(self):
assert "stats_dashboard" in self.src
def test_stats_models_documented(self):
assert "BotStats" in self.src
assert "ActivityDataPoint" in self.src
def test_stats_components_documented(self):
assert "StatsCardGrid" in self.src or "StatCard" in self.src
assert "ActivityChart" in self.src
def test_design_compliance_noted(self):
assert "0.dp" in self.src
assert "8.dp" in self.src
def test_art_direction_preserved(self):
assert "## Art Direction" in self.src
assert "#5865F2" in self.src
assert "#313338" in self.src
def test_file_ownership_table_updated(self):
lines = self.src.split("\n")
found = False
for line in lines:
if "StatsDashboardScreen" in line and "Active" in line:
found = True
break
assert found, "StatsDashboardScreen not in File Ownership table as Active"
def test_conventions_preserved(self):
assert "## Conventions" in self.src
assert "AppColors.*" in self.src