Skip to content

Commit

Permalink
Add webviz pytest fixture
Browse files Browse the repository at this point in the history
  • Loading branch information
Anders Fredrik Kiær committed Apr 6, 2020
1 parent e5255ce commit 18c6d59
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 70 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ venv
.DS_Store
dist
build
geckodriver.log
5 changes: 4 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,10 @@
"themes/default_assets/*",
]
},
entry_points={"console_scripts": ["webviz=webviz_config.command_line:main"]},
entry_points={
"console_scripts": ["webviz=webviz_config.command_line:main"],
"pytest11": ["webviz = webviz_config.testing.plugin"],
},
install_requires=[
# Pinning dash to the 1.7-series as long as
# https://github.com/plotly/dash-core-components/issues/746 is open
Expand Down
124 changes: 55 additions & 69 deletions tests/test_table_plotter.py
Original file line number Diff line number Diff line change
@@ -1,110 +1,96 @@
import time
import dash
from webviz_config.plugins import TablePlotter

from webviz_config.common_cache import CACHE
from webviz_config.themes import default_theme
from webviz_config.plugins import _table_plotter
CSV_FILE = "./tests/data/example_data.csv"


def test_table_plotter(dash_duo):
def test_table_plotter(webviz_single_plugin, dash_duo):

app = dash.Dash(__name__)
app.config.suppress_callback_exceptions = True
CACHE.init_app(app.server)
app.webviz_settings = {"theme": default_theme}
csv_file = "./tests/data/example_data.csv"
page = _table_plotter.TablePlotter(app, csv_file)
app.layout = page.layout
dash_duo.start_server(app)
webviz_single_plugin.check_portability()

app = webviz_single_plugin.app

# Wait for the app to render(there is probably a better way...)
time.sleep(5)
plugin = TablePlotter(app, csv_file=CSV_FILE)
app.layout = plugin.layout
dash_duo.start_server(app)

# Checking that no plot options are defined
assert page.plot_options == {}
assert plugin.plot_options == {}

# Check that filter is not active
assert not page.use_filter
assert not plugin.use_filter

# Checking that the correct plot type is initialized
plot_dd = dash_duo.find_element("#" + page.uuid("plottype"))
plot_dd = dash_duo.find_element("#" + plugin.uuid("plottype"))
assert plot_dd.text == "scatter"

# Checking that only the relevant options are shown
for plot_option in page.plot_args.keys():
plot_option_dd = dash_duo.find_element("#" + page.uuid(f"div-{plot_option}"))
if plot_option not in page.plots["scatter"]:
assert plot_option_dd.get_attribute("style") == "display: none;"
for plot_option in plugin.plot_args.keys():
if plot_option not in plugin.plots["scatter"]:
dash_duo.find_element("#" + plugin.uuid(f"div-{plot_option}"))
dash_duo.wait_for_style_to_equal(
"#" + plugin.uuid(f"div-{plot_option}"), style="display", val="none"
)

# Checking that options are initialized correctly
for option in ["x", "y"]:
plot_option_dd = dash_duo.find_element("#" + page.uuid(f"dropdown-{option}"))
plot_option_dd = dash_duo.find_element("#" + plugin.uuid(f"dropdown-{option}"))
assert plot_option_dd.text == "Well"


def test_table_plotter_filter(dash_duo):
def test_table_plotter_filter(webviz_single_plugin, dash_duo):

app = dash.Dash(__name__)
app.config.suppress_callback_exceptions = True
CACHE.init_app(app.server)
app.webviz_settings = {"theme": default_theme}
csv_file = "./tests/data/example_data.csv"
page = _table_plotter.TablePlotter(app, csv_file, filter_cols=["Well"])
app.layout = page.layout
dash_duo.start_server(app)
app = webviz_single_plugin.app

plugin = TablePlotter(app, csv_file=CSV_FILE, filter_cols=["Well"])
app.layout = plugin.layout

# Wait for the app to render(there is probably a better way...)
time.sleep(5)
dash_duo.start_server(app)

# Checking that no plot options are defined
assert page.plot_options == {}
assert plugin.plot_options == {}

# Check that filter is active
assert page.use_filter
assert page.filter_cols == ["Well"]
assert plugin.use_filter
assert plugin.filter_cols == ["Well"]

# Checking that the correct plot type is initialized
plot_dd = dash_duo.find_element("#" + page.uuid("plottype"))
plot_dd = dash_duo.find_element("#" + plugin.uuid("plottype"))
assert plot_dd.text == "scatter"

# Checking that only the relevant options are shown
for plot_option in page.plot_args.keys():
plot_option_dd = dash_duo.find_element("#" + page.uuid(f"div-{plot_option}"))
if plot_option not in page.plots["scatter"]:
assert "display: none;" in plot_option_dd.get_attribute("style")
for plot_option in plugin.plot_args.keys():
if plot_option not in plugin.plots["scatter"]:
dash_duo.find_element("#" + plugin.uuid(f"div-{plot_option}"))
dash_duo.wait_for_style_to_equal(
"#" + plugin.uuid(f"div-{plot_option}"), style="display", val="none"
)

# Checking that options are initialized correctly
for option in ["x", "y"]:
plot_option_dd = dash_duo.find_element("#" + page.uuid(f"dropdown-{option}"))
plot_option_dd = dash_duo.find_element("#" + plugin.uuid(f"dropdown-{option}"))
assert plot_option_dd.text == "Well"


def test_initialized_table_plotter(dash_duo):

app = dash.Dash(__name__)
app.css.config.serve_locally = True
app.scripts.config.serve_locally = True
app.config.suppress_callback_exceptions = True
CACHE.init_app(app.server)
app.webviz_settings = {"theme": default_theme}
csv_file = "./tests/data/example_data.csv"
plot_options = dict(
x="Well",
y="Initial reservoir pressure (bar)",
size="Average permeability (D)",
facet_col="Segment",
)

page = _table_plotter.TablePlotter(
app, csv_file, lock=True, plot_options=plot_options
)
app.layout = page.layout
dash_duo.start_server(app)
def test_initialized_table_plotter(webviz_single_plugin, dash_duo):

app = webviz_single_plugin.app

# Wait for the app to render(there is probably a better way...)
plot_options = {
"x": "Well",
"y": "Initial reservoir pressure (bar)",
"size": "Average permeability (D)",
"facet_col": "Segment",
}

plugin = TablePlotter(app, csv_file=CSV_FILE, lock=True, plot_options=plot_options)
app.layout = plugin.layout

dash_duo.start_server(app)

# Checking that plot options are defined
assert page.plot_options == plot_options
assert page.lock
assert plugin.plot_options == plot_options
assert plugin.lock

# Checking that the selectors are hidden
selector_row = dash_duo.find_element("#" + page.uuid("selector-row"))
selector_row = dash_duo.find_element("#" + plugin.uuid("selector-row"))
assert "display: none;" in selector_row.get_attribute("style")
38 changes: 38 additions & 0 deletions webviz_config/testing/_monitor_builtin_open.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import io
import site
import inspect
import importlib
import warnings
from pathlib import Path

WHITELISTED_FILENAMES = ["geckodriver.log", ".pytest-sugar.conf"]
WHITELISTED_PREFIXES = ["/tmp"] + site.PREFIXES
WHITELISTED_POSTFIXES = [str(Path(".plotly" / Path(".config"))), ".py", ".json"]
WHITELISTED_CONTAINS = [".pytest_cache", "__pycache__", ".cache", ".egg-info", "/dev/null"]

import builtins

FUNCTIONS = [("builtins", "open", "filepath"), ("pandas", "read_csv", "filepath"), ("xtgeo", "Well", "self")]

class MonitorBuiltinOpen:

def __init__(self):
self._original_functions = [getattr(importlib.import_module(module), function) for module, function, _ in FUNCTIONS]

def stop_monitoring(self):
pass
#builtins.open = self._original_open
#io.open = self._original_open

def start_monitoring(self):
pass
#def wrapped_open(*args, **kwargs):
#path = str(args[0])
#if Path(path).name not in WHITELISTED_FILENAMES and str(Path(path).parent) != "." and all([part not in path for part in WHITELISTED_CONTAINS]) and all([not path.startswith(prefix) for prefix in WHITELISTED_PREFIXES]) and all([not path.endswith(postfix) for postfix in WHITELISTED_POSTFIXES]):
# raise RuntimeError(f"File {path} opened, which is not white-listed as a 'portable' location.")
#return self._original_open(*args, **kwargs)

#builtins.open = wrapped_open
#io.open = wrapped_open

monitor_builtin_open = MonitorBuiltinOpen()
31 changes: 31 additions & 0 deletions webviz_config/testing/plugin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import pytest

import dash
from dash_html_components import Div

from ._monitor_builtin_open import monitor_builtin_open
from ..common_cache import CACHE
from ..themes import default_theme


class WebvizSinglePlugin:
def __init__(self):
self._app = dash.Dash(__name__)
self._configure_app()

def _configure_app(self):
self._app.config.suppress_callback_exceptions = True
CACHE.init_app(self._app.server)
self._app.webviz_settings = {"theme": default_theme}

def check_portability(self):
monitor_builtin_open.start_monitoring()

@property
def app(self):
return self._app


@pytest.fixture
def webviz_single_plugin():
return WebvizSinglePlugin()

0 comments on commit 18c6d59

Please sign in to comment.