#! /usr/bin/env python
"""Tests for the ``preview_image`` module.
Authors
-------
- Johannes Sahlmann
- Lauren Chambers
Use
---
These tests can be run via the command line (omit the ``-s`` to
suppress verbose output to ``stdout``):
::
pytest -s test_preview_image.py
"""
import glob
import os
import pytest
import shutil
from astropy.io import fits
from jwql.utils.preview_image import PreviewImage
from jwql.utils.utils import get_config, ensure_dir_exists
# directory to be created and populated during tests running
TEST_DIRECTORY = os.path.join(os.environ['HOME'], 'preview_image_test')
# Determine if tests are being run on Github Actions
ON_GITHUB_ACTIONS = '/home/runner' in os.path.expanduser('~') or '/Users/runner' in os.path.expanduser('~')
# Determine if the code is being run as part of a Readthedocs build
ON_READTHEDOCS = False
if 'READTHEDOCS' in os.environ:
ON_READTHEDOCS = os.environ['READTHEDOCS']
[docs]@pytest.fixture(scope="module")
def test_directory(test_dir=TEST_DIRECTORY):
"""Create a test directory for preview image.
Parameters
----------
test_dir : str
Path to directory used for testing
Yields
-------
test_dir : str
Path to directory used for testing
"""
# Set up local test directory
ensure_dir_exists(test_dir)
yield test_dir
# Tear down local test directory and any files within
if os.path.isdir(test_dir):
shutil.rmtree(test_dir)
# Empty test directory on central storage
jpgs = glob.glob(os.path.join(get_config()['test_dir'], '*.jpg'))
thumbs = glob.glob(os.path.join(get_config()['test_dir'], '*.thumbs'))
for file in jpgs + thumbs:
os.remove(file)
[docs]def get_test_fits_files():
"""Get a list of the FITS files on central storage to make preview images.
Returns
-------
filenames : list
List of filepaths to FITS files
"""
# Get the files from central store
if not ON_GITHUB_ACTIONS and not ON_READTHEDOCS:
filenames = glob.glob(os.path.join(get_config()['test_dir'], '*.fits'))
assert len(filenames) > 0
return filenames
# Or return an empty list
else:
return []
[docs]@pytest.mark.skipif(ON_GITHUB_ACTIONS, reason='Requires access to central storage.')
@pytest.mark.parametrize('filename', get_test_fits_files())
def test_make_image(test_directory, filename):
"""Use PreviewImage.make_image to create preview images of a sample
JWST exposure.
Assert that the number of JPGs created corresponds to the number of
integrations.
Parameters
----------
test_directory : str
Path of directory used for testing
filename : str
Path of FITS image to generate preview of
"""
header = fits.getheader(filename)
# Create and save the preview image or thumbnail
for create_thumbnail in [False, True]:
try:
image = PreviewImage(filename, "SCI")
image.clip_percent = 0.01
image.scaling = 'log'
image.cmap = 'viridis'
image.output_format = 'jpg'
image.thumbnail = create_thumbnail
if create_thumbnail:
image.thumbnail_output_directory = test_directory
else:
image.preview_output_directory = test_directory
image.make_image()
except ValueError as error:
print(error)
if create_thumbnail:
extension = 'thumb'
else:
extension = 'jpg'
# list of preview images
preview_image_filenames = glob.glob(os.path.join(test_directory, '*.{}'.format(
extension)))
assert len(preview_image_filenames) == header['NINTS']
# clean up: delete preview images
for file in preview_image_filenames:
os.remove(file)