code: def test_serve_with_get(tmp_path_factory):
      plugins_dir = tmp_path_factory.mktemp(
          "plugins_for_serve_with_get"
      )
      (plugins_dir / "init_for_serve_with_get.py").write_text(
          textwrap.dedent(
              """
          from datasette import hookimpl
  
          @hookimpl
          def startup(datasette):
              with open("{}", "w") as fp:
                  fp.write("hello")
      """.format(
                  str(plugins_dir / "hello.txt")
              ),
          ),
          "utf-8",
      )
      runner = CliRunner()
      result = runner.invoke(
          cli,
          [
              "serve",
              "--memory",
              "--plugins-dir",
              str(plugins_dir),
              "--get",
              "/_memory.json?sql=select+sqlite_version()",
          ],
      )
      assert result.exit_code == 0, result.output
      data = json.loads(result.output)
      # Should have a single row with a single column
      assert len(data["rows"]) == 1
      assert list(data["rows"][0].keys()) == ["sqlite_version()"]
      assert set(data.keys()) == {"rows", "ok", "truncated"}
  
      # The plugin should have created hello.txt
      assert (plugins_dir / "hello.txt").read_text() == "hello"
  
      # Annoyingly that new test plugin stays resident - we need
      # to manually unregister it to avoid conflict with other tests
      to_unregister = [
          p
          for p in pm.get_plugins()
          if p.__name__ == "init_for_serve_with_get.py"
      ][0]
      pm.unregister(to_unregister)
  
file_path: datasette/tests/test_cli_serve_get.py
imports: from datasette.cli import cli, serve
  from datasette.plugins import pm
  from click.testing import CliRunner
  import textwrap
  import json
label_desc: Use image node_id 1 for calling a global function with example usage: test_serve_with_get(tmp_path_factory) without return types