@@ -16,8 +16,11 @@ package runtime
1616
1717import (
1818 "errors"
19+ "net/http"
20+ "net/http/httptest"
1921 "os"
2022 "path/filepath"
23+ "strings"
2124 "testing"
2225)
2326
@@ -108,3 +111,79 @@ func TestDeleteContext_NotFound(t *testing.T) {
108111 t .Fatalf ("unexpected error: %v" , err )
109112 }
110113}
114+
115+ func TestDeleteContext_RemovesCacheOnSuccess (t * testing.T ) {
116+ sessionID := "sess-123"
117+
118+ // mock jupyter server that accepts DELETE
119+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
120+ if r .Method != http .MethodDelete {
121+ t .Fatalf ("unexpected method: %s" , r .Method )
122+ }
123+ if ! strings .HasSuffix (r .URL .Path , "/api/sessions/" + sessionID ) {
124+ t .Fatalf ("unexpected path: %s" , r .URL .Path )
125+ }
126+ w .WriteHeader (http .StatusNoContent )
127+ }))
128+ defer server .Close ()
129+
130+ c := NewController (server .URL , "token" )
131+ c .jupyterClientMap [sessionID ] = & jupyterKernel {language : Python }
132+ c .defaultLanguageJupyterSessions [Python ] = sessionID
133+
134+ if err := c .DeleteContext (sessionID ); err != nil {
135+ t .Fatalf ("DeleteContext returned error: %v" , err )
136+ }
137+
138+ if kernel := c .getJupyterKernel (sessionID ); kernel != nil {
139+ t .Fatalf ("expected cache to be cleared, found: %+v" , kernel )
140+ }
141+ if _ , ok := c .defaultLanguageJupyterSessions [Python ]; ok {
142+ t .Fatalf ("expected default session entry to be removed" )
143+ }
144+ }
145+
146+ func TestDeleteLanguageContext_RemovesCacheOnSuccess (t * testing.T ) {
147+ lang := Python
148+ session1 := "sess-1"
149+ session2 := "sess-2"
150+
151+ // mock jupyter server to accept two deletes
152+ deleteCalls := make (map [string ]int )
153+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
154+ if r .Method != http .MethodDelete {
155+ t .Fatalf ("unexpected method: %s" , r .Method )
156+ }
157+ if strings .Contains (r .URL .Path , session1 ) {
158+ deleteCalls [session1 ]++
159+ } else if strings .Contains (r .URL .Path , session2 ) {
160+ deleteCalls [session2 ]++
161+ } else {
162+ t .Fatalf ("unexpected path: %s" , r .URL .Path )
163+ }
164+ w .WriteHeader (http .StatusNoContent )
165+ }))
166+ defer server .Close ()
167+
168+ c := NewController (server .URL , "token" )
169+ c .jupyterClientMap [session1 ] = & jupyterKernel {language : lang }
170+ c .jupyterClientMap [session2 ] = & jupyterKernel {language : lang }
171+ c .defaultLanguageJupyterSessions [lang ] = session2
172+
173+ if err := c .DeleteLanguageContext (lang ); err != nil {
174+ t .Fatalf ("DeleteLanguageContext returned error: %v" , err )
175+ }
176+
177+ if _ , ok := c .jupyterClientMap [session1 ]; ok {
178+ t .Fatalf ("expected session1 removed from cache" )
179+ }
180+ if _ , ok := c .jupyterClientMap [session2 ]; ok {
181+ t .Fatalf ("expected session2 removed from cache" )
182+ }
183+ if _ , ok := c .defaultLanguageJupyterSessions [lang ]; ok {
184+ t .Fatalf ("expected default entry removed" )
185+ }
186+ if deleteCalls [session1 ] != 1 || deleteCalls [session2 ] != 1 {
187+ t .Fatalf ("unexpected delete calls: %+v" , deleteCalls )
188+ }
189+ }
0 commit comments