@@ -548,6 +548,46 @@ func TestDetectSelfNotTriggeredOnOtherGoProjects(t *testing.T) {
548548 }
549549}
550550
551+ func TestInvokeDetection (t * testing.T ) {
552+ dir := t .TempDir ()
553+ if err := os .WriteFile (filepath .Join (dir , "foo.py" ), []byte ("x = 1\n " ), 0o644 ); err != nil {
554+ t .Fatal (err )
555+ }
556+ tasks := "from invoke import task\n \n @task\n def build(c):\n c.run('true')\n "
557+ if err := os .WriteFile (filepath .Join (dir , "tasks.py" ), []byte (tasks ), 0o644 ); err != nil {
558+ t .Fatal (err )
559+ }
560+
561+ r , err := New (loadKB (t ), dir ).Run ()
562+ if err != nil {
563+ t .Fatalf ("unexpected error: %v" , err )
564+ }
565+
566+ assertToolDetected (t , r , "build" , "Invoke" )
567+ for _ , d := range r .Tools ["build" ] {
568+ if d .Name == "Invoke" {
569+ if d .Command == nil || d .Command .Run != "invoke --list" {
570+ t .Errorf ("expected 'invoke --list' command, got %v" , d .Command )
571+ }
572+ }
573+ }
574+
575+ // A tasks.py that doesn't import invoke should not trigger detection.
576+ celery := "from celery import shared_task\n \n @shared_task\n def foo():\n pass\n "
577+ if err := os .WriteFile (filepath .Join (dir , "tasks.py" ), []byte (celery ), 0o644 ); err != nil {
578+ t .Fatal (err )
579+ }
580+ r , err = New (loadKB (t ), dir ).Run ()
581+ if err != nil {
582+ t .Fatalf ("unexpected error: %v" , err )
583+ }
584+ for _ , d := range r .Tools ["build" ] {
585+ if d .Name == "Invoke" {
586+ t .Error ("tasks.py without invoke import should not trigger Invoke detection" )
587+ }
588+ }
589+ }
590+
551591func assertToolDetected (t * testing.T , r * brief.Report , category , name string ) {
552592 t .Helper ()
553593 tools , ok := r .Tools [category ]
0 commit comments