I am currently trying to use the Solara testing framework to try and do unit/regression testing of the rendering of Jupyter widgets, and I was wishing that I could just re-use all the pytest-mpl infrastructure to do figure hashes, galleries, etc. In a discussion with @Cadair we realised that it is possible, although a little ugly right now:
importipywidgetsaswidgetsimportmatplotlib.pyplotaspltimportplaywright.sync_apiimportpytestfromIPython.displayimportdisplayfromPILimportImage@pytest.mark.mpl_image_compare(savefig_kwargs={"dpi": 100})deftest_scatter_solara(
tmp_path,
solara_test,
page_session: playwright.sync_api.Page,
assert_solara_snapshot,
):
fromglue_jupyterimportjgluefromIPython.displayimportdisplayapp=jglue()
app.add_data(a={"x": [1, 2, 3], "y": [2, 3, 4]})
scatter=app.scatter2d(show=False)
display(scatter._layout)
button_sel=page_session.locator("text=No selection")
button_sel.wait_for()
screenshot=page_session.screenshot()
withopen(tmp_path/"screenshot.png", "wb") asf:
f.write(screenshot)
image=Image.open(tmp_path/"screenshot.png")
size_x, size_y=image.sizefig=plt.figure(figsize=(size_x/100, size_y/100))
ax=fig.add_axes([0, 0, 1, 1])
ax.imshow(image)
plt.axis("off")
returnfigBasically one can in principle take any image output and show it in a Matplotlib figure. However this is a bit hacky, and what would be a lot nicer would be if we could generalize this plugin to allow for alternatives to what actually generates the images, with Matplotlib being just one (and given the plugin name the default) option.
To keep this simple, we could also simply allow the returned value from tests to be a PIL Image instance as this would already allow any arbitrary image generation in the tests.
Does anyone have any thoughts on this? Any reason to not at least allow PIL returns?
I am currently trying to use the Solara testing framework to try and do unit/regression testing of the rendering of Jupyter widgets, and I was wishing that I could just re-use all the pytest-mpl infrastructure to do figure hashes, galleries, etc. In a discussion with @Cadair we realised that it is possible, although a little ugly right now:
Basically one can in principle take any image output and show it in a Matplotlib figure. However this is a bit hacky, and what would be a lot nicer would be if we could generalize this plugin to allow for alternatives to what actually generates the images, with Matplotlib being just one (and given the plugin name the default) option.
To keep this simple, we could also simply allow the returned value from tests to be a PIL Image instance as this would already allow any arbitrary image generation in the tests.
Does anyone have any thoughts on this? Any reason to not at least allow PIL returns?