roksta 0.2.7__cp314-cp314t-win_amd64.whl → 0.3.1__cp314-cp314t-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of roksta might be problematic. Click here for more details.

Files changed (100) hide show
  1. roksta/__init__.cp314t-win_amd64.pyd +0 -0
  2. roksta/ai/__init__.cp314t-win_amd64.pyd +0 -0
  3. roksta/ai/call_ai.cp314t-win_amd64.pyd +0 -0
  4. roksta/ai/gemini.cp314t-win_amd64.pyd +0 -0
  5. roksta/ai/generic.cp314t-win_amd64.pyd +0 -0
  6. roksta/ai/llm.cp314t-win_amd64.pyd +0 -0
  7. roksta/ai/openai.cp314t-win_amd64.pyd +0 -0
  8. roksta/ai/tools/__init__.cp314t-win_amd64.pyd +0 -0
  9. roksta/ai/tools/delete_file.cp314t-win_amd64.pyd +0 -0
  10. roksta/ai/tools/edit_file.cp314t-win_amd64.pyd +0 -0
  11. roksta/ai/tools/final_response.cp314t-win_amd64.pyd +0 -0
  12. roksta/ai/tools/get_file_summaries.cp314t-win_amd64.pyd +0 -0
  13. roksta/ai/tools/read_file.cp314t-win_amd64.pyd +0 -0
  14. roksta/ai/tools/regex_replace.cp314t-win_amd64.pyd +0 -0
  15. roksta/ai/tools/shell_any.cp314t-win_amd64.pyd +0 -0
  16. roksta/ai/tools/shell_limited.cp314t-win_amd64.pyd +0 -0
  17. roksta/ai/tools/tool_defs.cp314t-win_amd64.pyd +0 -0
  18. roksta/ai/tools/tool_utils.cp314t-win_amd64.pyd +0 -0
  19. roksta/ai/tools/write_file.cp314t-win_amd64.pyd +0 -0
  20. roksta/analytics.cp314t-win_amd64.pyd +0 -0
  21. roksta/balance.cp314t-win_amd64.pyd +0 -0
  22. roksta/build_project.cp314t-win_amd64.pyd +0 -0
  23. roksta/chat_workflow.cp314t-win_amd64.pyd +0 -0
  24. roksta/check_for_updates.cp314t-win_amd64.pyd +0 -0
  25. roksta/checkpoints.cp314t-win_amd64.pyd +0 -0
  26. roksta/clarify_goal.cp314t-win_amd64.pyd +0 -0
  27. roksta/codebase_listing.cp314t-win_amd64.pyd +0 -0
  28. roksta/command_handlers/__init__.cp314t-win_amd64.pyd +0 -0
  29. roksta/command_handlers/handle_activate_command.cp314t-win_amd64.pyd +0 -0
  30. roksta/command_handlers/handle_add_funds_command.cp314t-win_amd64.pyd +0 -0
  31. roksta/command_handlers/handle_auto_charge_command.cp314t-win_amd64.pyd +0 -0
  32. roksta/command_handlers/handle_auto_commit_command.cp314t-win_amd64.pyd +0 -0
  33. roksta/command_handlers/handle_building_command.cp314t-win_amd64.pyd +0 -0
  34. roksta/command_handlers/handle_chat_command.cp314t-win_amd64.pyd +0 -0
  35. roksta/command_handlers/handle_dev_rate_command.cp314t-win_amd64.pyd +0 -0
  36. roksta/command_handlers/handle_feedback_command.cp314t-win_amd64.pyd +0 -0
  37. roksta/command_handlers/handle_goal_command.cp314t-win_amd64.pyd +0 -0
  38. roksta/command_handlers/handle_help_command.cp314t-win_amd64.pyd +0 -0
  39. roksta/command_handlers/handle_init_command.cp314t-win_amd64.pyd +0 -0
  40. roksta/command_handlers/handle_linting_command.cp314t-win_amd64.pyd +0 -0
  41. roksta/command_handlers/handle_login_command.cp314t-win_amd64.pyd +0 -0
  42. roksta/command_handlers/handle_logout_command.cp314t-win_amd64.pyd +0 -0
  43. roksta/command_handlers/handle_payment_details_command.cp314t-win_amd64.pyd +0 -0
  44. roksta/command_handlers/handle_quit_command.cp314t-win_amd64.pyd +0 -0
  45. roksta/command_handlers/handle_redeem_command.cp314t-win_amd64.pyd +0 -0
  46. roksta/command_handlers/handle_request_activation_command.cp314t-win_amd64.pyd +0 -0
  47. roksta/command_handlers/handle_testing_command.cp314t-win_amd64.pyd +0 -0
  48. roksta/command_handlers/handle_usage_command.cp314t-win_amd64.pyd +0 -0
  49. roksta/create_default_config.cp314t-win_amd64.pyd +0 -0
  50. roksta/default_config.cp314t-win_amd64.pyd +0 -0
  51. roksta/enums.cp314t-win_amd64.pyd +0 -0
  52. roksta/env.cp314t-win_amd64.pyd +0 -0
  53. roksta/extended_text_area.cp314t-win_amd64.pyd +0 -0
  54. roksta/firebase.cp314t-win_amd64.pyd +0 -0
  55. roksta/firebase_auth_web.cp314t-win_amd64.pyd +0 -0
  56. roksta/firebase_config.cp314t-win_amd64.pyd +0 -0
  57. roksta/fix_tests.cp314t-win_amd64.pyd +0 -0
  58. roksta/gen_codebase_summaries.cp314t-win_amd64.pyd +0 -0
  59. roksta/gen_one_line_goal.cp314t-win_amd64.pyd +0 -0
  60. roksta/get_codebase_structure.cp314t-win_amd64.pyd +0 -0
  61. roksta/get_failing_tests.cp314t-win_amd64.pyd +0 -0
  62. roksta/goal_workflow.cp314t-win_amd64.pyd +0 -0
  63. roksta/init_codebase.cp314t-win_amd64.pyd +0 -0
  64. roksta/lint_code.cp314t-win_amd64.pyd +0 -0
  65. roksta/logger.cp314t-win_amd64.pyd +0 -0
  66. roksta/main.cp314t-win_amd64.pyd +0 -0
  67. roksta/make_issue.cp314t-win_amd64.pyd +0 -0
  68. roksta/new_features.cp314t-win_amd64.pyd +0 -0
  69. roksta/parse_readme.cp314t-win_amd64.pyd +0 -0
  70. roksta/propose_solution.cp314t-win_amd64.pyd +0 -0
  71. roksta/response_formats.cp314t-win_amd64.pyd +0 -0
  72. roksta/rewrite_goal.cp314t-win_amd64.pyd +0 -0
  73. roksta/roksta.cp314t-win_amd64.pyd +0 -0
  74. roksta/run_cli_goal.cp314t-win_amd64.pyd +0 -0
  75. roksta/select_files.cp314t-win_amd64.pyd +0 -0
  76. roksta/tips.cp314t-win_amd64.pyd +0 -0
  77. roksta/utils.cp314t-win_amd64.pyd +0 -0
  78. roksta/write_code.cp314t-win_amd64.pyd +0 -0
  79. {roksta-0.2.7.dist-info → roksta-0.3.1.dist-info}/METADATA +2 -1
  80. roksta-0.3.1.dist-info/RECORD +109 -0
  81. tests/conftest.py +42 -0
  82. tests/functions/{api_v0_01 → api_v1_01}/__init__.py +1 -1
  83. tests/functions/{api_v0_01 → api_v1_01}/test__analytics.py +2 -3
  84. tests/functions/{api_v0_01 → api_v1_01}/test__gemini_proxy.py +51 -6
  85. tests/functions/{api_v0_01 → api_v1_01}/test__generic_proxy.py +31 -2
  86. tests/functions/{api_v0_01 → api_v1_01}/test__get_payment_details.py +2 -2
  87. tests/functions/{api_v0_01 → api_v1_01}/test__openai_proxy.py +50 -14
  88. tests/functions/{api_v0_01 → api_v1_01}/test__redeem_credit_code.py +2 -2
  89. tests/functions/{api_v0_01 → api_v1_01}/test__sync_emails.py +3 -2
  90. tests/functions/{api_v0_01 → api_v1_01}/test__take_payment.py +2 -2
  91. tests/functions/{api_v0_01 → api_v1_01}/test__use_activation_code.py +3 -2
  92. tests/functions/test_utils.py +484 -0
  93. roksta/ai/tools.cp314t-win_amd64.pyd +0 -0
  94. roksta/command_handlers.cp314t-win_amd64.pyd +0 -0
  95. roksta-0.2.7.dist-info/RECORD +0 -78
  96. tests/functions/test_utils_functions.py +0 -222
  97. {roksta-0.2.7.dist-info → roksta-0.3.1.dist-info}/WHEEL +0 -0
  98. {roksta-0.2.7.dist-info → roksta-0.3.1.dist-info}/entry_points.txt +0 -0
  99. {roksta-0.2.7.dist-info → roksta-0.3.1.dist-info}/top_level.txt +0 -0
  100. /tests/functions/{test_main_functions.py → test_main.py} +0 -0
@@ -1,78 +0,0 @@
1
- roksta/__init__.cp314t-win_amd64.pyd,sha256=qZluEQnnwdWfwP-uMF20YRrlyR7i0MXiT75anLlEqIA,17408
2
- roksta/analytics.cp314t-win_amd64.pyd,sha256=2rfxHqwtN49FyB087eh8CvtAb4tgnKYPpnCk-0jXZ-4,117248
3
- roksta/balance.cp314t-win_amd64.pyd,sha256=QBrb-Y52i3HKY9cL9Qp00fL3yf8nX5ZbricAh7Izm20,139264
4
- roksta/build_project.cp314t-win_amd64.pyd,sha256=_Pi0-ZO0ybbL3EawEbTu_qiB05DEz8BjeIAsGXtUDTM,70656
5
- roksta/chat_workflow.cp314t-win_amd64.pyd,sha256=T9j6suIfyJXglBd-0a8hdJyOgDXSKNcBXcFPU-OX4oI,111616
6
- roksta/check_for_updates.cp314t-win_amd64.pyd,sha256=ugVNU9lbWell9d5UtZ1LaqhHUUZcgk9l1Z07WTYj4Tw,120320
7
- roksta/checkpoints.cp314t-win_amd64.pyd,sha256=0vGQk0YAly8vOjxyidoZnfTARLVEeqWRc-3p4xGxZbo,92160
8
- roksta/clarify_goal.cp314t-win_amd64.pyd,sha256=BSfs-gcJ2A1oy5ed7I1aBAfxnXHmvXgDtzyWV9Fhfew,76288
9
- roksta/codebase_listing.cp314t-win_amd64.pyd,sha256=88rnwkLfIJ2ma72kM4bE4wm_NwL7Rmu-a4DCaciDRpU,55296
10
- roksta/command_handlers.cp314t-win_amd64.pyd,sha256=yW5exV5Og1uwqxSwqUV0a03ZJMgEjh5cmjh0FXBo6jM,435712
11
- roksta/create_default_config.cp314t-win_amd64.pyd,sha256=ZQD1hMsPX-KBX_A1gCX4PANJ-fZAbFwok6X7oeZe9_8,33792
12
- roksta/default_config.cp314t-win_amd64.pyd,sha256=0Bfed9J6oAVpZz-2C6PiFJfPfI8-wrMq0TKe9saXMOI,33280
13
- roksta/enums.cp314t-win_amd64.pyd,sha256=lVmo1P8pRzMbgo3n6a1D5HknO0nt605SC7ThnjpL9pc,125440
14
- roksta/env.cp314t-win_amd64.pyd,sha256=LE55kWtrzQhWQGKXXYiGpH0a8WWzXZ99je5x4ebcMZw,27648
15
- roksta/extended_text_area.cp314t-win_amd64.pyd,sha256=zhPxxVInu3wr7SipYm5EV0rv9DeDhySBt5urms_edZw,125952
16
- roksta/firebase.cp314t-win_amd64.pyd,sha256=llbkB7Cb1bS9S1wRpCNPtEfj_1d5VLY0erlwUR3IvN0,204288
17
- roksta/firebase_auth_web.cp314t-win_amd64.pyd,sha256=h_n0J5uCGX6berO03k6RZ1wPmzoDtqcRFxcdsb1mDQY,206336
18
- roksta/firebase_config.cp314t-win_amd64.pyd,sha256=3HCHsAPBmfxlC2HR7KrQcXb-sSiJESX3AYl_HJdQuoI,20992
19
- roksta/fix_tests.cp314t-win_amd64.pyd,sha256=oQDZoFjmch2rNtNfYmUdSElH62HXqWOYAMbEWjpDqVQ,91648
20
- roksta/gen_codebase_summaries.cp314t-win_amd64.pyd,sha256=k7oth3XevLdi8Jg7xnZVfIYCCZIzWhd_qI7IMEYB0mg,284160
21
- roksta/gen_one_line_goal.cp314t-win_amd64.pyd,sha256=ZTUaRB5k4RADEVnR5TD55_0SZv-8ZS67giXxAF3MYj0,78336
22
- roksta/get_codebase_structure.cp314t-win_amd64.pyd,sha256=I3QCT3uANOchSUT7LSgAZpmWWyxlvgXW4NpqtdxrX6I,80896
23
- roksta/get_failing_tests.cp314t-win_amd64.pyd,sha256=GAJUqD2FFYDoWXn-Za5Imj4P8gD1kyvP3INm_Q-bCW8,83456
24
- roksta/goal_workflow.cp314t-win_amd64.pyd,sha256=ngZW14XhTm5Yr0szG3w_UcuvyIfNTqsFuJsXSjljOgs,229376
25
- roksta/init_codebase.cp314t-win_amd64.pyd,sha256=pDCeYxa35BK1JQCkxzIMjFJAXWyV-_0Z8INWCdjSELI,120832
26
- roksta/lint_code.cp314t-win_amd64.pyd,sha256=h55HHSoNGMfBxr3r5it03gQOzO-NT0ABi27gSd0l5zw,83456
27
- roksta/logger.cp314t-win_amd64.pyd,sha256=rQKHJFuLpYT9MMR86RNur015mshBHL3rmzdp7_XlELM,45056
28
- roksta/main.cp314t-win_amd64.pyd,sha256=n6TE1tbg_sARZDVQjvpJBdj-GGWx5kXLbT_XIYzeRRI,41984
29
- roksta/make_issue.cp314t-win_amd64.pyd,sha256=0DZEqd-GOsIoBmzxcfDiG_fZgFHYsXmrI-oQMpyGcUg,83968
30
- roksta/new_features.cp314t-win_amd64.pyd,sha256=p1C7fX3q2vI1t-M692fs8xaUNe3FhrLJ1WIGO4f8dj4,18432
31
- roksta/parse_readme.cp314t-win_amd64.pyd,sha256=yI95th81PreGdQCZgcu3D3qUmzAGY1EB1mwL3Je9WmQ,74240
32
- roksta/propose_solution.cp314t-win_amd64.pyd,sha256=othtnKLOprjyknIHgxOcciNPEwjrMxHDsObTB8OqpGY,72192
33
- roksta/response_formats.cp314t-win_amd64.pyd,sha256=Dj2sO7ThjhMBckr_W9GMFdp5ux3Z0S_CfoWIREXvoto,38912
34
- roksta/rewrite_goal.cp314t-win_amd64.pyd,sha256=ulZ4f3oRtBt_mR_aP9rqb5iKkB85JFU2gmIubOaI9JU,65024
35
- roksta/roksta.cp314t-win_amd64.pyd,sha256=7DxsUqZJhPfh8v8QnxHBaRLp3xZeheoIaxFQCsEQbjg,272384
36
- roksta/run_cli_goal.cp314t-win_amd64.pyd,sha256=yEp0-f6MrKsU7872QU38kZm0IhNhUSG4tHTQJpIA4P4,77824
37
- roksta/select_files.cp314t-win_amd64.pyd,sha256=A9poUVSNSttPvXRWfra6-N9QoTtErKEkyJUoYjGj_U4,77312
38
- roksta/tips.cp314t-win_amd64.pyd,sha256=Xia7F0Xp8s9DuqhzOI8B50ECWG0B16osJXALt_TAupw,22528
39
- roksta/utils.cp314t-win_amd64.pyd,sha256=YhIiy1_pVUUXdsGbK6bFU4EEekP5jo6OStXi6VRJt8w,285184
40
- roksta/write_code.cp314t-win_amd64.pyd,sha256=Ep0SHbH_EeHX7Yw7nkWcd8FrqTv_AOQX5aRdkOSKpfQ,68608
41
- roksta/ai/__init__.cp314t-win_amd64.pyd,sha256=ag5phrD8k5kXiQj9WlNWsp4ln-I8zZEW1Do0TGYmtFI,17408
42
- roksta/ai/call_ai.cp314t-win_amd64.pyd,sha256=pDhaJ3IANDYOOnm2tVaTEKcmGhux6tXaZq8yFd6PX40,84480
43
- roksta/ai/gemini.cp314t-win_amd64.pyd,sha256=n6tVztwopZLzqthIckvHrjnUHoQAiqH32wYFjofF9ok,176640
44
- roksta/ai/generic.cp314t-win_amd64.pyd,sha256=WFZ8-GDdks19qUcuozanKDy5tDvxZvzhbXawljhZkuA,134144
45
- roksta/ai/llm.cp314t-win_amd64.pyd,sha256=DY3jEqO9eDpeiQRcjOE1i7Y6L3OUlZyE6V7n-LkJJfo,94720
46
- roksta/ai/openai.cp314t-win_amd64.pyd,sha256=SrmVRNR87GTNnhcCe1TALJdg3JbY1Q0tBTvBdhSko8w,131584
47
- roksta/ai/tools.cp314t-win_amd64.pyd,sha256=Q1YKYOPVOqTb_EOl91a8yKRnzSHULpoYVDkIB4Rci5g,278016
48
- tests/__init__.py,sha256=meQjVtD2zimtDw3tIP6nNWHGDQVC42as-c_y038cYnk,126
49
- tests/conftest.py,sha256=auOTmcnUGIgvlQsVEOhchjLgUtQmnzMtCc5N3Sr79Cw,6464
50
- tests/functions/__init__.py,sha256=msAiuVOA8jfqVxichPYYyfBFCVEFB_xRvj4lrSpKK1w,97
51
- tests/functions/test_auth.py,sha256=SNzmpkoxknrxx6cTE91MM2kN3F08GB1pRuupP5IrQs0,1016
52
- tests/functions/test_main_functions.py,sha256=LgWLAOtSfDXNfHhAAr-j9Peb5JBLFtQ0eKAWqTxLNDU,2648
53
- tests/functions/test_utils_functions.py,sha256=2x4W2JGnnKabTSTNKQ_DdcZl7K9HVF0N4kudTL05b3Y,7590
54
- tests/functions/api_v0_01/__init__.py,sha256=6EY0sGI3Jkmk4BGjNzSgyLGxFIGy06vwD76KDKAHh4g,126
55
- tests/functions/api_v0_01/test__analytics.py,sha256=d0zfl_ydtFc8cxlaL5GV76Rz2P7XsHoqEp2rYdN1zk0,16224
56
- tests/functions/api_v0_01/test__gemini_proxy.py,sha256=BuT2IWS0NHCa1FzEN8YPf6t00TOjWbpF-SYSOZMWPCg,11459
57
- tests/functions/api_v0_01/test__generic_proxy.py,sha256=2CSQ8OYUM0Ertq9PYueWDBWgPmz5bpRO8YICAwA_ZUc,16589
58
- tests/functions/api_v0_01/test__get_payment_details.py,sha256=wvhH5xliVIkU6GvvWFKF-lAV8mSZfj0HCT284BjDYCw,14091
59
- tests/functions/api_v0_01/test__openai_proxy.py,sha256=tXAz-Ukl3FD1Zdv083xczoQzG-dOS53uL2gBjB-Wcx8,16174
60
- tests/functions/api_v0_01/test__redeem_credit_code.py,sha256=xDzTWQxcIztksCWpTNibNgZ2ZPT2gqgdtljZiE8wMlU,6514
61
- tests/functions/api_v0_01/test__sync_emails.py,sha256=5nH4wxcqHqowc4C-pNShF4eWS52Pw6hZxsaOTn7f66I,13022
62
- tests/functions/api_v0_01/test__take_payment.py,sha256=NFoIw4RVMT63c7diZ7gt6N03dp26vVlognZBchpWRLY,18513
63
- tests/functions/api_v0_01/test__use_activation_code.py,sha256=3XS-N-fL7UIOev2kzphlDy-2ukykQLzb_0kmlkCr1gQ,17396
64
- tests/functions/api_v1_00/__init__.py,sha256=VdV5Oy6FRVT4S1xK34YodylJ7FY6jqvjujkS2Qvbyt0,126
65
- tests/functions/api_v1_00/test__analytics.py,sha256=s_pK4ySr86PC4ZBr7Y7bCHOEuFj36amaWrianBZ_QbU,16222
66
- tests/functions/api_v1_00/test__gemini_proxy.py,sha256=ZNYBQ9agPyNYGAVYlWPY6IF8wP_5IQ4nbHOpY8TnKEw,13696
67
- tests/functions/api_v1_00/test__generic_proxy.py,sha256=f2KjO8v_mh4nBwdkFXJLYfFUBpJS_RDtQNfn0ltE2oM,18101
68
- tests/functions/api_v1_00/test__get_payment_details.py,sha256=GRMAn8WR-07EBZ0IkeVE4MARFUbDdDhEHO2dITRxnVA,14091
69
- tests/functions/api_v1_00/test__openai_proxy.py,sha256=i1f7S8IFgWiG6WGG-YYptjTCOjSudujEMyhP16BVlW0,18175
70
- tests/functions/api_v1_00/test__redeem_credit_code.py,sha256=A5WwuSXBX5TiZPdYrDRkUmpppBXG00lcP0LmRz0gNr0,6514
71
- tests/functions/api_v1_00/test__sync_emails.py,sha256=e0rb637Ois25t__1G8Yp7Pj8WgC-R1I9SUgS6bK1dsU,13024
72
- tests/functions/api_v1_00/test__take_payment.py,sha256=RQBUHcgN3-XOoPtAjca_72q4BaZxr_L3G_Nss5-gb2g,18513
73
- tests/functions/api_v1_00/test__use_activation_code.py,sha256=ZOCwXHzenH0l1WhmZP8s8vaXIk58lHpKJ0igx0VEDwY,17398
74
- roksta-0.2.7.dist-info/METADATA,sha256=tqdrCdR2ZSh1KSc_8dkuQ8tXOVkASKraZpUqAQgptjU,1466
75
- roksta-0.2.7.dist-info/WHEEL,sha256=IxxXYqBIlKEzFy9ulBJ928Gdqg6XQ3DHti4avqq3myk,102
76
- roksta-0.2.7.dist-info/entry_points.txt,sha256=mzRdYg_DlzZRwjxYUt9-gyoRCkM1QBTeTbwETgiTdGw,44
77
- roksta-0.2.7.dist-info/top_level.txt,sha256=lvciNZQ1dPGXpiCLdWVXK03n9fKHjbQdwjqQbnUjeYM,13
78
- roksta-0.2.7.dist-info/RECORD,,
@@ -1,222 +0,0 @@
1
- import importlib
2
- import sys
3
- import types
4
- import json
5
- import pytest
6
-
7
-
8
- def _setup_basic_stubs(secret_data=b'MY_SECRET', secret_side_effect=None, auth_verify=lambda token: {'uid': 'u1'}):
9
- """Install minimal stub modules for google.cloud.secretmanager, firebase_functions and firebase_admin.
10
- Returns a dict of original sys.modules entries for cleanup.
11
- """
12
- orig = {}
13
- names = [
14
- 'google',
15
- 'google.cloud',
16
- 'google.cloud.secretmanager',
17
- 'firebase_functions',
18
- 'firebase_admin',
19
- 'firebase_admin.auth',
20
- ]
21
- for name in names:
22
- orig[name] = sys.modules.get(name)
23
-
24
- # google package and submodules
25
- google_mod = types.ModuleType('google')
26
- cloud_mod = types.ModuleType('google.cloud')
27
- secretmanager_mod = types.ModuleType('google.cloud.secretmanager')
28
-
29
- class _Payload:
30
- def __init__(self, data):
31
- self.data = data
32
-
33
- class _Response:
34
- def __init__(self, data):
35
- self.payload = _Payload(data)
36
-
37
- class SecretManagerServiceClient:
38
- def access_secret_version(self, request=None):
39
- if secret_side_effect:
40
- # raise the provided exception instance for testing
41
- raise secret_side_effect
42
- return _Response(secret_data)
43
-
44
- secretmanager_mod.SecretManagerServiceClient = SecretManagerServiceClient
45
- cloud_mod.secretmanager = secretmanager_mod
46
- google_mod.cloud = cloud_mod
47
-
48
- sys.modules['google'] = google_mod
49
- sys.modules['google.cloud'] = cloud_mod
50
- sys.modules['google.cloud.secretmanager'] = secretmanager_mod
51
-
52
- # firebase_functions stub with a Response type expected by utils.create_json_response
53
- firebase_functions_mod = types.ModuleType('firebase_functions')
54
-
55
- class FakeResponse:
56
- def __init__(self, response=None, mimetype=None, status=200, **kwargs):
57
- self.status_code = status
58
- if isinstance(response, (dict, list)):
59
- self._body_text = json.dumps(response)
60
- else:
61
- self._body_text = '' if response is None else response
62
- self.headers = kwargs.get('headers', {})
63
-
64
- def get_data(self, as_text=False):
65
- if as_text:
66
- return self._body_text
67
- return self._body_text.encode('utf-8')
68
-
69
- firebase_functions_mod.https_fn = types.SimpleNamespace(Request=object, Response=FakeResponse)
70
- sys.modules['firebase_functions'] = firebase_functions_mod
71
-
72
- # firebase_admin + auth stub
73
- firebase_admin_mod = types.ModuleType('firebase_admin')
74
- auth_mod = types.ModuleType('firebase_admin.auth')
75
-
76
- def _verify_id_token(token):
77
- return auth_verify(token)
78
-
79
- auth_mod.verify_id_token = _verify_id_token
80
- firebase_admin_mod.auth = auth_mod
81
- sys.modules['firebase_admin'] = firebase_admin_mod
82
- sys.modules['firebase_admin.auth'] = auth_mod
83
-
84
- return orig
85
-
86
-
87
- def _restore_orig(orig):
88
- for name, val in orig.items():
89
- if val is None:
90
- if name in sys.modules:
91
- del sys.modules[name]
92
- else:
93
- sys.modules[name] = val
94
-
95
-
96
- def test_get_secret_key_returns_decoded_string_on_success():
97
- orig = _setup_basic_stubs(secret_data=b'MY_SECRET')
98
- try:
99
- if 'utils' in sys.modules:
100
- del sys.modules['utils']
101
- utils = importlib.import_module('utils')
102
- res = utils.get_secret_key('any')
103
- assert res == 'MY_SECRET'
104
- finally:
105
- _restore_orig(orig)
106
-
107
-
108
- def test_get_secret_key_raises_exception_on_client_error():
109
- orig = _setup_basic_stubs(secret_side_effect=Exception('boom'))
110
- try:
111
- if 'utils' in sys.modules:
112
- del sys.modules['utils']
113
- utils = importlib.import_module('utils')
114
- with pytest.raises(Exception) as exc:
115
- utils.get_secret_key('any')
116
- assert 'Failed to retrieve secret key' in str(exc.value)
117
- assert 'boom' in str(exc.value)
118
- finally:
119
- _restore_orig(orig)
120
-
121
-
122
- def test_verify_firebase_token_raises_when_header_missing_or_invalid():
123
- orig = _setup_basic_stubs()
124
- try:
125
- if 'utils' in sys.modules:
126
- del sys.modules['utils']
127
- utils = importlib.import_module('utils')
128
-
129
- class DummyRequest:
130
- def __init__(self, headers=None):
131
- self.headers = headers or {}
132
-
133
- # Missing header
134
- req = DummyRequest(headers={})
135
- with pytest.raises(Exception) as exc:
136
- utils.verify_firebase_token(req)
137
- assert 'Missing or invalid Authorization header' in str(exc.value)
138
-
139
- # Header present but not starting with 'Bearer '
140
- req2 = DummyRequest(headers={'Authorization': 'Token abc'})
141
- with pytest.raises(Exception) as exc2:
142
- utils.verify_firebase_token(req2)
143
- assert 'Missing or invalid Authorization header' in str(exc2.value)
144
- finally:
145
- _restore_orig(orig)
146
-
147
-
148
- def test_verify_firebase_token_calls_auth_verify_and_returns_payload():
149
- orig = _setup_basic_stubs(auth_verify=lambda token: {'uid': 'user_1'})
150
- try:
151
- if 'utils' in sys.modules:
152
- del sys.modules['utils']
153
- utils = importlib.import_module('utils')
154
-
155
- class DummyRequest:
156
- def __init__(self, headers=None):
157
- self.headers = headers or {}
158
-
159
- req = DummyRequest(headers={'Authorization': 'Bearer TOK'})
160
- res = utils.verify_firebase_token(req)
161
- assert res == {'uid': 'user_1'}
162
- finally:
163
- _restore_orig(orig)
164
-
165
-
166
- def test_verify_firebase_token_wraps_auth_exceptions():
167
- def _raiser(token):
168
- raise Exception('bad token')
169
-
170
- orig = _setup_basic_stubs(auth_verify=_raiser)
171
- try:
172
- if 'utils' in sys.modules:
173
- del sys.modules['utils']
174
- utils = importlib.import_module('utils')
175
-
176
- class DummyRequest:
177
- def __init__(self, headers=None):
178
- self.headers = headers or {}
179
-
180
- req = DummyRequest(headers={'Authorization': 'Bearer TOK'})
181
- with pytest.raises(Exception) as exc:
182
- utils.verify_firebase_token(req)
183
- assert 'Authentication failed' in str(exc.value)
184
- assert 'bad token' in str(exc.value)
185
- finally:
186
- _restore_orig(orig)
187
-
188
-
189
- def test_get_api_key_uses_lowercase_family_name_and_get_secret_key(monkeypatch):
190
- orig = _setup_basic_stubs()
191
- try:
192
- if 'utils' in sys.modules:
193
- del sys.modules['utils']
194
- utils = importlib.import_module('utils')
195
-
196
- called = {}
197
-
198
- def fake_get_secret_key(name):
199
- called['name'] = name
200
- return 'THE_KEY'
201
-
202
- monkeypatch.setattr(utils, 'get_secret_key', fake_get_secret_key)
203
- from enums import LlmFamily
204
- res = utils.get_api_key(LlmFamily.OPENAI)
205
- assert res == 'THE_KEY'
206
- assert called['name'] == 'openai-api-key'
207
- finally:
208
- _restore_orig(orig)
209
-
210
-
211
- def test_create_json_response_returns_formatted_response():
212
- orig = _setup_basic_stubs()
213
- try:
214
- if 'utils' in sys.modules:
215
- del sys.modules['utils']
216
- utils = importlib.import_module('utils')
217
- resp = utils.create_json_response(True, {'a': 1}, 201)
218
- assert getattr(resp, 'status_code', None) == 201
219
- data = json.loads(resp.get_data(as_text=True))
220
- assert data == {"success": True, "payload": {"a": 1}}
221
- finally:
222
- _restore_orig(orig)
File without changes