Skip to content

Commit

Permalink
Skip interactive tests automatically
Browse files Browse the repository at this point in the history
  • Loading branch information
jacebrowning committed Dec 26, 2020
1 parent 71ce6c5 commit b172c12
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 49 deletions.
13 changes: 4 additions & 9 deletions pomace/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from cleo import Application, Command
from IPython import embed

from . import models, prompts, shared, utils
from . import models, prompts, utils
from .config import settings


Expand Down Expand Up @@ -79,20 +79,15 @@ def run_loop(self):
page = models.autopage()
self.display_url(page)
while True:
choices = [self.RELOAD_ACTIONS] + dir(page)
command = shared.cli.Bullet(
prompt="\nSelect an action: ", bullet=" ● ", choices=choices
)
action = command.launch()
if action == self.RELOAD_ACTIONS:
action = prompts.action(page)
if action is None:
reload(models)
self.clear_screen()
page = models.autopage()
self.display_url(page)
continue

command = shared.cli.Input(prompt="\nValue: ")
page, transitioned = page.perform(action, prompt=command.launch)
page, transitioned = page.perform(action)
if transitioned:
self.clear_screen()
self.display_url(page)
Expand Down
11 changes: 2 additions & 9 deletions pomace/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,17 +43,10 @@ class Settings:
secrets: List[Site] = field(default_factory=list)

def __getattr__(self, name):
if name.startswith("_") or not shared.cli:
if name.startswith("_"):
return object.__getattribute__(self, name)

value = self.get_secret(name)
if value is not None:
return value

command = shared.cli.Input(prompt=f"{name}: ")
value = command.launch()
self.set_secret(name, value)
return value
return self.get_secret(name) or ""

def get_secret(self, name, *, _log=True) -> Optional[str]:
domain = URL(shared.browser.url).domain
Expand Down
6 changes: 3 additions & 3 deletions pomace/models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from contextlib import suppress
from typing import Callable, List, Optional, Tuple
from typing import List, Optional, Tuple

import log
from bs4 import BeautifulSoup
Expand Down Expand Up @@ -265,10 +265,10 @@ def __getattr__(self, value: str) -> Action:
def __contains__(self, value):
return value in self.text

def perform(self, name: str, *, prompt: Callable) -> Tuple["Page", bool]:
def perform(self, name: str) -> Tuple["Page", bool]:
action = getattr(self, name)
if action.verb in {"fill", "select"}:
value = settings.get_secret(action.name) or prompt()
value = settings.get_secret(action.name) or prompts.named_value(action.name)
settings.update_secret(action.name, value)
page = action(value, _page=self)
else:
Expand Down
65 changes: 51 additions & 14 deletions pomace/prompts.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,37 @@
import os
from typing import Tuple
import sys
from typing import Optional, Tuple

from . import browser, enums, shared
import log

from . import browser, enums
from .config import settings


try:
import bullet
except ImportError:
bullet = None # https://github.com/Mckinsey666/bullet/issues/2
log.warn("Interactive CLI prompts not yet supported on Windows")

if "pytest" in sys.modules:
bullet = None
log.warn("Interactive CLI prompts disabled while testing")


RELOAD_ACTIONS = "<reload actions>"
CANCEL = "<cancel>"


def browser_if_unset():
if settings.browser.name:
return

if "CI" in os.environ or not shared.cli:
if "CI" in os.environ or not bullet:
settings.browser.name = os.getenv("BROWSER", "firefox")
return

command = shared.cli.Bullet(
command = bullet.Bullet(
prompt="\nSelect a browser for automation: ",
bullet=" ● ",
choices=browser.NAMES,
Expand All @@ -27,16 +45,16 @@ def url_if_unset(domains=None):
if settings.url:
return

if "CI" in os.environ or not shared.cli:
if "CI" in os.environ or not bullet:
settings.url = "http://example.com"
return

if domains:
command = shared.cli.Bullet(
command = bullet.Bullet(
prompt="\nStarting domain: ", bullet=" ● ", choices=domains
)
else:
command = shared.cli.Input(prompt="\nStarting domain: ", strip=True)
command = bullet.Input(prompt="\nStarting domain: ", strip=True)
value = command.launch()
print()
settings.url = f"https://{value}"
Expand All @@ -46,32 +64,51 @@ def secret_if_unset(name: str):
if settings.get_secret(name, _log=False):
return

if "CI" in os.environ or not shared.cli:
if "CI" in os.environ or not bullet:
settings.set_secret(name, "<unset>")
return

command = shared.cli.Input(prompt=f"{name}: ")
command = bullet.Input(prompt=f"{name}: ")
value = command.launch()
print()
settings.set_secret(name, value)


def action(page) -> Optional[str]:
choices = [RELOAD_ACTIONS] + dir(page)
command = bullet.Bullet(
prompt="\nSelect an action: ", bullet=" ● ", choices=choices
)
value = command.launch()
print()
return None if value == RELOAD_ACTIONS else value


def named_value(name: str) -> Optional[str]:
if not bullet:
return None

command = bullet.Input(prompt="Value for " + name.replace("_", " ") + ": ")
value = command.launch()
return value


def mode_and_value() -> Tuple[str, str]:
if not shared.cli:
if not bullet:
return "", ""

choices = ["<cancel>"] + [mode.value for mode in enums.Mode]
command = shared.cli.Bullet(
choices = [CANCEL] + [mode.value for mode in enums.Mode]
command = bullet.Bullet(
prompt="\nSelect element locator: ",
bullet=" ● ",
choices=choices,
)
mode = command.launch()
if mode == "<cancel>":
if mode == CANCEL:
print()
return "", ""

command = shared.cli.Input("\nValue to match: ")
command = bullet.Input("\nValue to match: ")
value = command.launch()
print()
return mode, value
7 changes: 0 additions & 7 deletions pomace/shared.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,4 @@
import log
from splinter import Browser


try:
import bullet as cli # pylint: disable=unused-import
except ImportError:
cli = None # https://github.com/Mckinsey666/bullet/issues/2
log.warn("Interactive CLI prompts not yet supported on Windows")

browser: Browser = None
5 changes: 0 additions & 5 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,6 @@ def settings():
_settings.datafile.text = backup


@pytest.fixture
def cli_disabled(monkeypatch):
monkeypatch.setattr(shared, "cli", None)


@pytest.fixture
def browser(settings):
if "APPVEYOR" in os.environ:
Expand Down
4 changes: 2 additions & 2 deletions tests/test_data.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# pylint: disable=unused-variable,unused-argument,expression-not-assigned
# pylint: disable=unused-argument,expression-not-assigned

from pomace.models import Page

Expand All @@ -17,7 +17,7 @@ def test_locator_uses_are_persisted(expect, browser):
expect(bad_locator.uses) <= 0


def test_unused_actions_are_removed_on_forced_cleanup(expect, browser, cli_disabled):
def test_unused_actions_are_removed_on_forced_cleanup(expect, browser):
page = Page.at("https://www.wikipedia.org")
page.click_foobar()
previous_count = len(page.actions)
Expand Down

0 comments on commit b172c12

Please sign in to comment.