From b0876e98e8d69ca186b3638f7a0d994dd5638934 Mon Sep 17 00:00:00 2001 From: Akash S <96624761+AkashS0510@users.noreply.github.com> Date: Mon, 13 Oct 2025 11:27:55 +0530 Subject: [PATCH] Add test environment for problem 8987d2b1-e121-4474-8cb9-0e4a885fd047-v1 --- Dockerfile | 6 ++ test.sh | 16 ++++++ tests/test_form_defaults.py | 106 ++++++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 Dockerfile create mode 100755 test.sh create mode 100644 tests/test_form_defaults.py diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..7a7d9a7e1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,6 @@ +FROM public.ecr.aws/x8v8d7g8/mars-base:latest +WORKDIR /app +COPY . . +RUN pip install -r requirements.txt +CMD ["/bin/bash"] + diff --git a/test.sh b/test.sh new file mode 100755 index 000000000..181d13b0d --- /dev/null +++ b/test.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -e + +# Usage: ./test.sh base # runs baseline tests +# ./test.sh new # runs newly added tests (must fail before solution) + +if [[ "$1" == "base" ]]; then + # Run only your baseline/existing tests + pytest tests/existing_tests.py +elif [[ "$1" == "new" ]]; then + # Run the newly-added tests expected to fail before bugfix + pytest tests/test_form_defaults.py +else + echo "Usage: ./test.sh {base|new}" + exit 1 +fi diff --git a/tests/test_form_defaults.py b/tests/test_form_defaults.py new file mode 100644 index 000000000..05874b22a --- /dev/null +++ b/tests/test_form_defaults.py @@ -0,0 +1,106 @@ +# NOTE: Documentation requirement is not validated by tests; reviewer should check manually. + +from fastapi import FastAPI, Form, UploadFile, File +from fastapi.testclient import TestClient + +app = FastAPI() + +@app.post("/demo/") +def demo_endpoint(field: str = Form("default_value")): + return {"field": field} + +@app.post("/demo_int/") +def demo_int_endpoint(field: int = Form(42)): + return {"field": field} + +@app.post("/demo_float/") +def demo_float_endpoint(field: float = Form(3.14)): + return {"field": field} + +@app.post("/demo_opt/") +def demo_opt_endpoint(field: str = Form(None)): + return {"field": field} + +@app.post("/fileupload/") +def fileupload_endpoint(file: UploadFile = File(None)): + return {"filename": file.filename if file else None} + +@app.post("/other/") +def other_endpoint(foo: str = Form("other")): + return {"foo": foo} + +client = TestClient(app) + +def test_blank_field_uses_default(): + response = client.post("/demo/", data={"field": ""}) + assert response.json()["field"] == "default_value" + +def test_missing_field_uses_default(): + response = client.post("/demo/", data={}) + assert response.json()["field"] == "default_value" + +def test_blank_int_field_uses_default(): + response = client.post("/demo_int/", data={"field": ""}) + assert response.json()["field"] == 42 + +def test_missing_int_field_uses_default(): + response = client.post("/demo_int/", data={}) + assert response.json()["field"] == 42 + +def test_blank_float_field_uses_default(): + response = client.post("/demo_float/", data={"field": ""}) + assert response.json()["field"] == 3.14 + +def test_missing_float_field_uses_default(): + response = client.post("/demo_float/", data={}) + assert response.json()["field"] == 3.14 + +def test_optional_field_default_none(): + response = client.post("/demo_opt/", data={}) + assert response.json()["field"] is None + +def test_blank_optional_field_results_in_none(): + response = client.post("/demo_opt/", data={"field": ""}) + assert response.json()["field"] is None + +def test_blank_field_multipart_uses_default(): + response = client.post("/demo/", files={"field": ("", "")}) + assert response.json()["field"] == "default_value" + +def test_missing_field_multipart_uses_default(): + response = client.post("/demo/", files={}) + assert response.json()["field"] == "default_value" + +def test_multipart_blank_text_field_uses_default(): + response = client.post("/demo/", data={"field": ""}, files={"dummy": ("filename.txt", "dummycontent")}) + assert response.json()["field"] == "default_value" + +def test_multipart_blank_int_field_uses_default(): + response = client.post("/demo_int/", data={"field": ""}, files={"dummy": ("file.txt", "dummy")}) + assert response.json()["field"] == 42 + +def test_multipart_blank_float_field_uses_default(): + response = client.post("/demo_float/", data={"field": ""}, files={"dummy": ("file.txt", "dummy")}) + assert response.json()["field"] == 3.14 + +def test_blank_uploadfile_defaults_to_none(): + response = client.post("/fileupload/", files={"file": ("", "")}) + assert response.json()["filename"] is None + +def test_fileupload_actual_upload_works(): + files = {"file": ("afile.txt", "dummydata")} + response = client.post("/fileupload/", files=files) + assert response.json()["filename"] == "afile.txt" + +def test_json_request_unaffected(): + response = client.post("/demo/", json={"field": ""}) + assert response.json()["field"] == "" + +def test_json_missing_field_uses_default(): + response = client.post("/demo/", json={}) + assert response.json()["field"] == "default_value" + +def test_other_request_regression_not_broken(): + response = client.post("/other/", data={}) + assert response.json()["foo"] == "other" +