def test_invalid_configuration(): with pytest.raises(exceptions.InvalidConfigurationException) as excinfo: create_app(None, None, None) assert ( "Target is not specified (FUNCTION_TARGET environment variable not set)" == str(excinfo.value))
def test_invalid_function_definition_missing_dependency(): source = TEST_FUNCTIONS_DIR / "background_missing_dependency" / "main.py" target = "function" with pytest.raises(_ModuleNotFoundError) as excinfo: create_app(target, source, "event") assert "No module named 'nonexistentpackage'" in str(excinfo.value)
def test_invalid_function_definition_multiple_entry_points(): source = TEST_FUNCTIONS_DIR / "background_multiple_entry_points" / "main.py" target = "function" with pytest.raises(exceptions.MissingTargetException) as excinfo: create_app(target, source, "event") assert re.match("File .* is expected to contain a function named function", str(excinfo.value))
def test_invalid_function_definition_missing_function_file(): source = TEST_FUNCTIONS_DIR / "missing_function_file" / "main.py" target = "functions" with pytest.raises(exceptions.MissingSourceException) as excinfo: create_app(target, source) assert re.match( "File .* that is expected to define function doesn't exist", str(excinfo.value))
def test_invalid_function_definition_function_syntax_error(): source = TEST_FUNCTIONS_DIR / "background_load_error" / "main.py" target = "function" with pytest.raises(SyntaxError) as excinfo: create_app(target, source, "event") assert any(( "invalid syntax" in str(excinfo.value), # Python <3.8 "unmatched ')'" in str(excinfo.value), # Python >3.8 ))
def test_invalid_function_definition_multiple_entry_points_not_a_function(): source = TEST_FUNCTIONS_DIR / "background_multiple_entry_points" / "main.py" target = "notAFunction" with pytest.raises(exceptions.InvalidTargetTypeException) as excinfo: create_app(target, source, "event") assert re.match( "The function defined in file .* as notAFunction needs to be of type " "function. Got: .*", str(excinfo.value), )
def _cli(target, source, signature_type, host, port, debug, dry_run): app = create_app(target, source, signature_type) if dry_run: click.echo("Function: {}".format(target)) click.echo("URL: http://{}:{}/".format(host, port)) click.echo("Dry run successful, shutting down.") else: create_server(app, debug).run(host, port)
def test_class_in_main_is_in_right_module(): source = TEST_FUNCTIONS_DIR / "module_is_correct" / "main.py" target = "function" client = create_app(target, source).test_client() resp = client.get("/") assert resp.status_code == 200
def test_http_function_executes_throw(): source = TEST_FUNCTIONS_DIR / "http_trigger" / "main.py" target = "function" client = create_app(target, source).test_client() resp = client.put("/", json={"mode": "THROW"}) assert resp.status_code == 500
def test_function_returns_none(): source = TEST_FUNCTIONS_DIR / "returns_none" / "main.py" target = "function" client = create_app(target, source).test_client() resp = client.get("/") assert resp.status_code == 500
def test_flask_current_app_is_available(): source = TEST_FUNCTIONS_DIR / "flask_current_app" / "main.py" target = "function" client = create_app(target, source).test_client() resp = client.get("/") assert resp.status_code == 200
def test_background_function_executes_entry_point_two(background_json): source = TEST_FUNCTIONS_DIR / "background_multiple_entry_points" / "main.py" target = "myFunctionBar" client = create_app(target, source, "event").test_client() resp = client.post("/", json=background_json) assert resp.status_code == 200
def test_background_function_executes(background_json): source = TEST_FUNCTIONS_DIR / "background_trigger" / "main.py" target = "function" client = create_app(target, source, "event").test_client() resp = client.post("/", json=background_json) assert resp.status_code == 200
def test_relative_imports(): source = TEST_FUNCTIONS_DIR / "relative_imports" / "main.py" target = "function" client = create_app(target, source).test_client() resp = client.get("/") assert resp.status_code == 200 assert resp.data == b"success"
def test_http_function_check_env_function_signature_type(): source = TEST_FUNCTIONS_DIR / "http_check_env" / "main.py" target = "function" client = create_app(target, source).test_client() resp = client.post("/", json={"mode": "FUNCTION_SIGNATURE_TYPE"}) assert resp.status_code == 200 assert resp.data == b"http"
def test_http_function_request_path_path(): source = TEST_FUNCTIONS_DIR / "http_request_check" / "main.py" target = "function" client = create_app(target, source).test_client() resp = client.get("/my_path", json={"mode": "path"}) assert resp.status_code == 200 assert resp.data == b"/my_path"
def test_http_function_request_url_slash(): source = TEST_FUNCTIONS_DIR / "http_request_check" / "main.py" target = "function" client = create_app(target, source).test_client() resp = client.get("/", json={"mode": "url"}) assert resp.status_code == 200 assert resp.data == b"http://localhost/"
def test_http_function_request_url_empty_path(): source = TEST_FUNCTIONS_DIR / "http_request_check" / "main.py" target = "function" client = create_app(target, source).test_client() resp = client.get("", json={"mode": "url"}) assert resp.status_code == 308 assert resp.location == "http://localhost/"
def test_non_cloudevent_(): source = TEST_FUNCTIONS_DIR / "cloudevents" / "main.py" target = "function" client = create_app(target, source, "cloudevent").test_client() resp = client.post("/", json="{not_event}") assert resp.status_code == 400 assert resp.data != b"OK"
def test_http_function_executes_failure(): source = TEST_FUNCTIONS_DIR / "http_trigger" / "main.py" target = "function" client = create_app(target, source).test_client() resp = client.get("/", json={"mode": "FAILURE"}) assert resp.status_code == 400 assert resp.data == b"failure"
def test_http_function_executes_success(): source = TEST_FUNCTIONS_DIR / "http_trigger" / "main.py" target = "function" client = create_app(target, source).test_client() resp = client.post("/my_path", json={"mode": "SUCCESS"}) assert resp.status_code == 200 assert resp.data == b"success"
def test_http_function_all_methods(method, data): source = TEST_FUNCTIONS_DIR / "http_method_check" / "main.py" target = "function" client = create_app(target, source).test_client() resp = getattr(client, method)("/") assert resp.status_code == 200 assert resp.data == data
def test_error_paths(path): source = TEST_FUNCTIONS_DIR / "http_trigger" / "main.py" target = "function" client = create_app(target, source).test_client() resp = client.get("/{}".format(path)) assert resp.status_code == 404 assert b"Not Found" in resp.data
def test_http_function_with_import(): source = TEST_FUNCTIONS_DIR / "http_with_import" / "main.py" target = "function" client = create_app(target, source).test_client() resp = client.get("/") assert resp.status_code == 200 assert resp.data == b"Hello"
def test_legacy_function_log_severity(monkeypatch, capfd, mode, expected): source = TEST_FUNCTIONS_DIR / "http_check_severity" / "main.py" target = "function" monkeypatch.setenv("ENTRY_POINT", target) client = create_app(target, source).test_client() resp = client.post("/", json={"mode": mode}) captured = capfd.readouterr().err assert resp.status_code == 200 assert expected in captured
def test_legacy_function_returns_none(monkeypatch): source = TEST_FUNCTIONS_DIR / "returns_none" / "main.py" target = "function" monkeypatch.setenv("ENTRY_POINT", target) client = create_app(target, source).test_client() resp = client.get("/") assert resp.status_code == 200 assert resp.data == b"OK"
def test_errorhandler(monkeypatch): source = TEST_FUNCTIONS_DIR / "errorhandler" / "main.py" target = "function" monkeypatch.setenv("ENTRY_POINT", target) client = create_app(target, source).test_client() resp = client.get("/") assert resp.status_code == 418 assert resp.data == b"I'm a teapot"
def test_http_function_execution_time(): source = TEST_FUNCTIONS_DIR / "http_trigger_sleep" / "main.py" target = "function" client = create_app(target, source).test_client() start_time = time.time() resp = client.get("/", json={"mode": "1000"}) execution_time_sec = time.time() - start_time assert resp.status_code == 200 assert resp.data == b"OK"
def test_legacy_function_check_env(monkeypatch): source = TEST_FUNCTIONS_DIR / "http_check_env" / "main.py" target = "function" monkeypatch.setenv("ENTRY_POINT", target) client = create_app(target, source).test_client() resp = client.post("/", json={"mode": "FUNCTION_TRIGGER_TYPE"}) assert resp.status_code == 200 assert resp.data == b"http" resp = client.post("/", json={"mode": "FUNCTION_NAME"}) assert resp.status_code == 200 assert resp.data.decode("utf-8") == target
def test_http_function_flask_render_template(): source = TEST_FUNCTIONS_DIR / "http_flask_render_template" / "main.py" target = "function" client = create_app(target, source).test_client() resp = client.post("/", json={"message": "test_message"}) assert resp.status_code == 200 assert resp.data == (b"<!doctype html>\n<html>\n" b" <body>\n" b" <h1>Hello test_message!</h1>\n" b" </body>\n" b"</html>")