Unit tests for now --plugin-secret option

Also added new --show-files option to  - useful for debugging.
This commit is contained in:
Simon Willison 2019-07-07 16:57:04 -07:00
commit 741760d05c
3 changed files with 71 additions and 0 deletions

View file

@ -1,6 +1,7 @@
from datasette import hookimpl from datasette import hookimpl
import click import click
import json import json
import os
from subprocess import run, PIPE from subprocess import run, PIPE
from .common import ( from .common import (
@ -24,6 +25,11 @@ def publish_subcommand(publish):
@click.option("--token", help="Auth token to use for deploy") @click.option("--token", help="Auth token to use for deploy")
@click.option("--alias", multiple=True, help="Desired alias e.g. yoursite.now.sh") @click.option("--alias", multiple=True, help="Desired alias e.g. yoursite.now.sh")
@click.option("--spatialite", is_flag=True, help="Enable SpatialLite extension") @click.option("--spatialite", is_flag=True, help="Enable SpatialLite extension")
@click.option(
"--show-files",
is_flag=True,
help="Output the generated Dockerfile and metadata.json",
)
def nowv1( def nowv1(
files, files,
metadata, metadata,
@ -47,6 +53,7 @@ def publish_subcommand(publish):
token, token,
alias, alias,
spatialite, spatialite,
show_files,
): ):
fail_if_publish_binary_not_installed("now", "Zeit Now", "https://zeit.co/now") fail_if_publish_binary_not_installed("now", "Zeit Now", "https://zeit.co/now")
if extra_options: if extra_options:
@ -106,6 +113,13 @@ def publish_subcommand(publish):
else: else:
done = run("now", stdout=PIPE) done = run("now", stdout=PIPE)
deployment_url = done.stdout deployment_url = done.stdout
if show_files:
if os.path.exists("metadata.json"):
print("=== metadata.json ===\n")
print(open("metadata.json").read())
print("\n==== Dockerfile ====\n")
print(open("Dockerfile").read())
print("\n====================\n")
if alias: if alias:
# I couldn't get --target=production working, so I call # I couldn't get --target=production working, so I call
# 'now alias' with arguments directly instead - but that # 'now alias' with arguments directly instead - but that

View file

@ -26,4 +26,5 @@ Options:
--token TEXT Auth token to use for deploy --token TEXT Auth token to use for deploy
--alias TEXT Desired alias e.g. yoursite.now.sh --alias TEXT Desired alias e.g. yoursite.now.sh
--spatialite Enable SpatialLite extension --spatialite Enable SpatialLite extension
--show-files Output the generated Dockerfile and metadata.json
--help Show this message and exit. --help Show this message and exit.

View file

@ -1,6 +1,7 @@
from click.testing import CliRunner from click.testing import CliRunner
from datasette import cli from datasette import cli
from unittest import mock from unittest import mock
import json
import subprocess import subprocess
@ -105,3 +106,58 @@ def test_publish_now_multiple_aliases(mock_run, mock_which):
), ),
] ]
) )
@mock.patch("shutil.which")
@mock.patch("datasette.publish.now.run")
def test_publish_now_plugin_secrets(mock_run, mock_which):
mock_which.return_value = True
mock_run.return_value = mock.Mock(0)
mock_run.return_value.stdout = b"https://demo.example.com/"
runner = CliRunner()
with runner.isolated_filesystem():
open("test.db", "w").write("data")
result = runner.invoke(
cli.cli,
[
"publish",
"now",
"test.db",
"--token",
"XXX",
"--plugin-secret",
"datasette-auth-github",
"client_id",
"x-client-id",
"--show-files",
],
)
dockerfile = (
result.output.split("==== Dockerfile ====\n")[1]
.split("\n====================\n")[0]
.strip()
)
expected = """FROM python:3.6
COPY . /app
WORKDIR /app
ENV DATASETTE_AUTH_GITHUB_CLIENT_ID 'x-client-id'
RUN pip install -U datasette
RUN datasette inspect test.db --inspect-file inspect-data.json
ENV PORT 8001
EXPOSE 8001
CMD datasette serve --host 0.0.0.0 -i test.db --cors --inspect-file inspect-data.json --metadata metadata.json --config force_https_urls:on --port $PORT""".strip()
assert expected == dockerfile
metadata = (
result.output.split("=== metadata.json ===\n")[1]
.split("\n==== Dockerfile ====\n")[0]
.strip()
)
assert {
"plugins": {
"datasette-auth-github": {
"client_id": {"$env": "DATASETTE_AUTH_GITHUB_CLIENT_ID"}
}
}
} == json.loads(metadata)