1
+ import json
2
+ import os
3
+ import threading
4
+ import unittest
5
+
6
+ from http .server import BaseHTTPRequestHandler , HTTPServer
7
+ from test .support import EnvironmentVarGuard
8
+ from urllib .parse import urlparse
9
+ from kaggle_session import UserSessionClient
10
+ from kaggle_web_client import (_KAGGLE_URL_BASE_ENV_VAR_NAME ,
11
+ _KAGGLE_USER_SECRETS_TOKEN_ENV_VAR_NAME ,
12
+ CredentialError , BackendError )
13
+
14
+ class UserSessionHTTPHandler (BaseHTTPRequestHandler ):
15
+
16
+ def set_request (self ):
17
+ raise NotImplementedError ()
18
+
19
+ def get_response (self ):
20
+ raise NotImplementedError ()
21
+
22
+ def do_HEAD (s ):
23
+ s .send_response (200 )
24
+
25
+ def do_POST (s ):
26
+ s .set_request ()
27
+ s .send_response (200 )
28
+ s .send_header ("Content-type" , "application/json" )
29
+ s .end_headers ()
30
+ s .wfile .write (json .dumps (s .get_response ()).encode ("utf-8" ))
31
+
32
+ class TestUserSessionClient (unittest .TestCase ):
33
+ SERVER_ADDRESS = urlparse (os .getenv (_KAGGLE_URL_BASE_ENV_VAR_NAME , default = "http://127.0.0.1:8001" ))
34
+ TEST_JWT = 'test-secrets-key'
35
+
36
+ def _test_client (self , client_func , expected_path , expected_body , source = None , success = True ):
37
+ _request = {}
38
+
39
+ class GetKernelRunSourceForCaipHandler (UserSessionHTTPHandler ):
40
+ def set_request (self ):
41
+ _request ['path' ] = self .path
42
+ content_len = int (self .headers .get ('Content-Length' ))
43
+ _request ['body' ] = json .loads (self .rfile .read (content_len ))
44
+ _request ['headers' ] = self .headers
45
+
46
+ def get_response (self ):
47
+ if success :
48
+ return {'result' : {'source' : source }, 'wasSuccessful' : 'true' }
49
+ return {'wasSuccessful' : 'false' }
50
+
51
+ env = EnvironmentVarGuard ()
52
+ env .set (_KAGGLE_USER_SECRETS_TOKEN_ENV_VAR_NAME , self .TEST_JWT )
53
+ with env :
54
+ with HTTPServer ((self .SERVER_ADDRESS .hostname , self .SERVER_ADDRESS .port ), GetKernelRunSourceForCaipHandler ) as httpd :
55
+ threading .Thread (target = httpd .serve_forever ).start ()
56
+
57
+ try :
58
+ client_func ()
59
+ finally :
60
+ httpd .shutdown ()
61
+
62
+ path , headers , body = _request ['path' ], _request ['headers' ], _request ['body' ]
63
+ self .assertEqual (
64
+ path ,
65
+ expected_path ,
66
+ msg = "Fake server did not receive the right request from UserSessionClient." )
67
+ self .assertEqual (
68
+ body ,
69
+ expected_body ,
70
+ msg = "Fake server did not receive the right body from UserSessionClient." )
71
+
72
+ def test_no_token_fails (self ):
73
+ env = EnvironmentVarGuard ()
74
+ env .unset (_KAGGLE_USER_SECRETS_TOKEN_ENV_VAR_NAME )
75
+ with env :
76
+ with self .assertRaises (CredentialError ):
77
+ client = UserSessionClient ()
78
+
79
+ def test_get_exportable_ipynb_succeeds (self ):
80
+ source = "import foo"
81
+
82
+ def call_get_ipynb ():
83
+ client = UserSessionClient ()
84
+ response = client .get_exportable_ipynb ()
85
+ self .assertEqual (source , response ['source' ])
86
+
87
+ self ._test_client (
88
+ call_get_ipynb ,
89
+ '/requests/GetKernelRunSourceForCaipRequest' ,
90
+ {'UseDraft' : True },
91
+ source = source ,
92
+ success = True )
93
+
94
+ def test_get_exportable_ipynb_fails (self ):
95
+ def call_get_ipynb ():
96
+ client = UserSessionClient ()
97
+ with self .assertRaises (BackendError ):
98
+ client .get_exportable_ipynb ()
99
+
100
+ self ._test_client (
101
+ call_get_ipynb ,
102
+ '/requests/GetKernelRunSourceForCaipRequest' ,
103
+ {'UseDraft' : True },
104
+ success = False )
0 commit comments