@@ -158,6 +158,158 @@ else
158158 echo -e " ${YELLOW} Skipping ws ticket tests (yq not installed)${NC} "
159159fi
160160
161+ # =============================================================================
162+ # Alias Command Tests
163+ # =============================================================================
164+
165+ echo " "
166+ echo -e " ${YELLOW} Alias Command Tests${NC} "
167+
168+ if command -v yq & > /dev/null; then
169+ # Setup: backup existing global config and use a temp one
170+ ALIAS_BACKUP=" "
171+ if [ -f " $HOME /.crabcode/config.yaml" ]; then
172+ ALIAS_BACKUP=$( mktemp)
173+ cp " $HOME /.crabcode/config.yaml" " $ALIAS_BACKUP "
174+ fi
175+ # Ensure clean alias state — remove aliases key if present
176+ if [ -f " $HOME /.crabcode/config.yaml" ]; then
177+ yq -i ' del(.aliases)' " $HOME /.crabcode/config.yaml" 2> /dev/null || true
178+ fi
179+
180+ # Test: list aliases when none configured
181+ run_test " Alias list (empty)" " '$CRABCODE ' alias 2>&1 | grep -q 'No aliases configured'"
182+
183+ # Test: set requires a name
184+ run_test " Alias set no args" " '$CRABCODE ' alias set 2>&1 | grep -q 'Usage'"
185+
186+ # Test: set requires a command value
187+ run_test " Alias set no value" " '$CRABCODE ' alias set myalias 2>&1 | grep -q 'Usage'"
188+
189+ # Test: set rejects invalid alias names
190+ run_test " Alias set rejects spaces" " '$CRABCODE ' alias set 'bad name' cmd 2>&1 | grep -q 'Invalid alias name'"
191+ run_test " Alias set rejects special chars" " '$CRABCODE ' alias set 'bad!name' cmd 2>&1 | grep -q 'Invalid alias name'"
192+
193+ # Test: set accepts valid names
194+ run_test " Alias set single word" " '$CRABCODE ' alias set testalias1 restart 2>&1 | grep -q 'Alias set'"
195+ run_test " Alias set with hyphen" " '$CRABCODE ' alias set test-alias2 cleanup 2>&1 | grep -q 'Alias set'"
196+ run_test " Alias set with underscore" " '$CRABCODE ' alias set test_alias3 'ws new' 2>&1 | grep -q 'Alias set'"
197+
198+ # Test: list shows created aliases
199+ run_test " Alias list shows alias" " '$CRABCODE ' alias 2>&1 | grep -q 'testalias1'"
200+ run_test " Alias list shows value" " '$CRABCODE ' alias 2>&1 | grep -q 'restart'"
201+
202+ # Test: aliases are persisted in global config
203+ run_test " Alias persisted in config" " yq -r '.aliases.testalias1' '$HOME /.crabcode/config.yaml' | grep -q 'restart'"
204+
205+ # Test: overwrite existing alias
206+ run_test " Alias overwrite" " '$CRABCODE ' alias set testalias1 cleanup 2>&1 | grep -q 'Alias set'"
207+ run_test " Alias overwrite persisted" " yq -r '.aliases.testalias1' '$HOME /.crabcode/config.yaml' | grep -q 'cleanup'"
208+
209+ # Test: remove alias
210+ run_test " Alias rm" " '$CRABCODE ' alias rm testalias1 2>&1 | grep -q 'Removed alias'"
211+
212+ # Test: remove nonexistent alias
213+ run_test " Alias rm nonexistent" " '$CRABCODE ' alias rm nonexistent 2>&1 | grep -q 'not found'"
214+
215+ # Test: rm requires a name
216+ run_test " Alias rm no args" " '$CRABCODE ' alias rm 2>&1 | grep -q 'Usage'"
217+
218+ # Test: unknown subcommand
219+ run_test " Alias unknown subcommand" " '$CRABCODE ' alias foobar 2>&1 | grep -q 'Unknown alias subcommand'"
220+
221+ # Cleanup test aliases
222+ " $CRABCODE " alias rm test-alias2 2> /dev/null || true
223+ " $CRABCODE " alias rm test_alias3 2> /dev/null || true
224+
225+ # Restore original global config
226+ if [ -n " $ALIAS_BACKUP " ]; then
227+ cp " $ALIAS_BACKUP " " $HOME /.crabcode/config.yaml"
228+ rm -f " $ALIAS_BACKUP "
229+ fi
230+ else
231+ echo -e " ${YELLOW} Skipping alias tests (yq not installed)${NC} "
232+ fi
233+
234+ # =============================================================================
235+ # Alias Resolution Tests
236+ # =============================================================================
237+
238+ echo " "
239+ echo -e " ${YELLOW} Alias Resolution Tests${NC} "
240+
241+ if command -v yq & > /dev/null; then
242+ # Setup: backup and create a controlled config
243+ ALIAS_RES_BACKUP=" "
244+ if [ -f " $HOME /.crabcode/config.yaml" ]; then
245+ ALIAS_RES_BACKUP=$( mktemp)
246+ cp " $HOME /.crabcode/config.yaml" " $ALIAS_RES_BACKUP "
247+ fi
248+
249+ # Set an alias that maps to a known command
250+ " $CRABCODE " alias set testver ' --version' 2> /dev/null
251+
252+ # Test: alias resolves to the target command
253+ run_test " Alias resolves to target" " '$CRABCODE ' testver 2>&1 | grep -q 'crabcode'"
254+
255+ # Set a multi-word alias
256+ " $CRABCODE " alias set testhelp ' --help' 2> /dev/null
257+
258+ run_test " Multi-word alias resolves" " '$CRABCODE ' testhelp 2>&1 | grep -q 'crab'"
259+
260+ # Cleanup
261+ " $CRABCODE " alias rm testver 2> /dev/null || true
262+ " $CRABCODE " alias rm testhelp 2> /dev/null || true
263+
264+ if [ -n " $ALIAS_RES_BACKUP " ]; then
265+ cp " $ALIAS_RES_BACKUP " " $HOME /.crabcode/config.yaml"
266+ rm -f " $ALIAS_RES_BACKUP "
267+ fi
268+ else
269+ echo -e " ${YELLOW} Skipping alias resolution tests (yq not installed)${NC} "
270+ fi
271+
272+ # =============================================================================
273+ # Msg Command Tests
274+ # =============================================================================
275+
276+ echo " "
277+ echo -e " ${YELLOW} Msg Command Tests${NC} "
278+
279+ # Test: msg help
280+ run_test " Msg help" " '$CRABCODE ' msg help 2>&1 | grep -qE 'P2P Messaging|msg'"
281+ run_test " Msg no args shows help" " '$CRABCODE ' msg 2>&1 | grep -qE 'P2P Messaging|msg'"
282+
283+ # Test: msg status without relay
284+ run_test " Msg status shows info" " '$CRABCODE ' msg status 2>&1 | grep -qE 'Message Status|Name|Relay'"
285+
286+ # Test: msg say without args shows current state
287+ run_test " Msg say shows state" " '$CRABCODE ' msg say 2>&1 | grep -qE 'Text-to-speech'"
288+
289+ # Test: msg say on/off toggles
290+ run_test " Msg say on" " '$CRABCODE ' msg say on 2>&1 | grep -q 'enabled'"
291+ run_test " Msg say off" " '$CRABCODE ' msg say off 2>&1 | grep -q 'disabled'"
292+
293+ # Test: msg say shows updated state after toggle
294+ run_test " Msg say reflects off state" " '$CRABCODE ' msg say 2>&1 | grep -q 'off'"
295+
296+ # Reset to default
297+ " $CRABCODE " msg say on 2> /dev/null || true
298+
299+ # Test: msg unknown subcommand
300+ run_test " Msg unknown subcommand" " '$CRABCODE ' msg foobar 2>&1 | grep -q 'Unknown msg command'"
301+
302+ # Test: msg read without relay (should not crash)
303+ run_test " Msg read graceful without relay" " '$CRABCODE ' msg read 2>&1; true"
304+
305+ # Test: msg history without relay (should not crash)
306+ run_test " Msg history graceful without relay" " '$CRABCODE ' msg history 2>&1; true"
307+
308+ # Test: msg start requires python3
309+ if ! command -v python3 & > /dev/null; then
310+ run_test " Msg start without python3" " '$CRABCODE ' msg start 2>&1 | grep -q 'Python3'"
311+ fi
312+
161313# =============================================================================
162314# Integration Tests (require Docker or real setup)
163315# =============================================================================
0 commit comments