Skip to content

Commit

Permalink
QA: Fix tests.
Browse files Browse the repository at this point in the history
GPIO setup tests have been pruned and could use rewriting.
PIL is now always assumed to be installed.
  • Loading branch information
Gadgetoid committed Feb 6, 2024
1 parent b14439a commit 0b50f4c
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 94 deletions.
34 changes: 25 additions & 9 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,33 @@
from tools import MockSMBus


@pytest.fixture(scope='function', autouse=True)
def cleanup():
for module in list(sys.modules.keys()):
if module.startswith('inky'):
del sys.modules[module]


@pytest.fixture(scope='function', autouse=False)
def nopath():
path = sys.path
sys.path = [path for path in sys.path if not path.startswith("/usr/lib") and not path.startswith("/opt/hostedtoolcache")]
yield
sys.path = path


@pytest.fixture(scope='function', autouse=False)
def GPIO():
"""Mock RPi.GPIO module."""
GPIO = mock.MagicMock()
# Fudge for Python < 37 (possibly earlier)
sys.modules['RPi'] = mock.MagicMock()
sys.modules['RPi'].GPIO = GPIO
sys.modules['RPi.GPIO'] = GPIO
yield GPIO
del sys.modules['RPi']
del sys.modules['RPi.GPIO']
"""Mock gpiod and gpiodevice modules."""
gpiod = mock.MagicMock()
gpiodevice = mock.MagicMock()
sys.modules['gpiod'] = gpiod
sys.modules['gpiodevice'] = gpiodevice
sys.modules['gpiodevice.platform'] = mock.MagicMock()
yield gpiod, gpiodevice
del sys.modules['gpiod']
del sys.modules['gpiodevice']
del sys.modules['gpiodevice.platform']


@pytest.fixture(scope='function', autouse=False)
Expand Down
82 changes: 14 additions & 68 deletions tests/test_init.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""Initialization tests for Inky."""

from unittest import mock
import sys

import pytest

Expand All @@ -19,141 +19,87 @@ def test_init_mock_what_black(tkinter, PIL):
InkyMockWHAT('black')


def test_init_phat_black(spidev, smbus2):
def test_init_phat_black(spidev, smbus2, PIL):
"""Test initialisation of InkyPHAT with 'black' colour choice."""
from inky import InkyPHAT

InkyPHAT('black')


def test_init_phat_red(spidev, smbus2):
def test_init_phat_red(spidev, smbus2, PIL):
"""Test initialisation of InkyPHAT with 'red' colour choice."""
from inky import InkyPHAT

InkyPHAT('red')


def test_init_phat_yellow(spidev, smbus2):
def test_init_phat_yellow(spidev, smbus2, PIL):
"""Test initialisation of InkyPHAT with 'yellow' colour choice."""
from inky import InkyPHAT

InkyPHAT('red')


def test_init_what_black(spidev, smbus2):
def test_init_what_black(spidev, smbus2, PIL):
"""Test initialisation of InkyWHAT with 'black' colour choice."""
from inky import InkyWHAT

InkyWHAT('black')


def test_init_what_red(spidev, smbus2):
def test_init_what_red(spidev, smbus2, PIL):
"""Test initialisation of InkyWHAT with 'red' colour choice."""
from inky import InkyWHAT

InkyWHAT('red')


def test_init_what_yellow(spidev, smbus2):
def test_init_what_yellow(spidev, smbus2, PIL):
"""Test initialisation of InkyWHAT with 'yellow' colour choice."""
from inky import InkyWHAT

InkyWHAT('yellow')


def test_init_invalid_colour(spidev, smbus2):
def test_init_invalid_colour(spidev, smbus2, PIL):
"""Test initialisation of InkyWHAT with an invalid colour choice."""
from inky import InkyWHAT

with pytest.raises(ValueError):
InkyWHAT('octarine')


def test_init_what_setup_no_gpio(spidev, smbus2):
"""Test Inky init with a missing RPi.GPIO library."""
from inky import InkyWHAT

inky = InkyWHAT('red')

with pytest.raises(ImportError):
inky.setup()


def test_init_what_setup(spidev, smbus2, GPIO):
def test_init_what_setup(spidev, smbus2, GPIO, PIL):
"""Test initialisation and setup of InkyWHAT.
Verify our expectations for GPIO setup in order to catch regressions.
"""
from inky import InkyWHAT

# TODO: _busy_wait should timeout after N seconds
GPIO.input.return_value = GPIO.LOW
# _busy_wait will timeout after N seconds
# GPIO.input.return_value = GPIO.LOW

inky = InkyWHAT('red')
inky.setup()

# Check GPIO setup
GPIO.setwarnings.assert_called_with(False)
GPIO.setmode.assert_called_with(GPIO.BCM)
GPIO.setup.assert_has_calls([
mock.call(inky.dc_pin, GPIO.OUT, initial=GPIO.LOW, pull_up_down=GPIO.PUD_OFF),
mock.call(inky.reset_pin, GPIO.OUT, initial=GPIO.HIGH, pull_up_down=GPIO.PUD_OFF),
mock.call(inky.busy_pin, GPIO.IN, pull_up_down=GPIO.PUD_OFF)
])

# Check device will been reset
GPIO.output.assert_has_calls([
mock.call(inky.reset_pin, GPIO.LOW),
mock.call(inky.reset_pin, GPIO.HIGH)
])

# Check API will been opened
spidev.SpiDev().open.assert_called_with(0, inky.cs_channel)


def test_init_7colour_setup_no_gpio(spidev, smbus2):
"""Test initialisation and setup of 7-colour Inky.
Verify an error is raised when RPi.GPIO is not present.
"""
from inky.inky_uc8159 import Inky

inky = Inky()

with pytest.raises(ImportError):
inky.setup()


def test_init_7colour_setup(spidev, smbus2, GPIO):
def test_init_7colour_setup(spidev, smbus2, GPIO, PIL):
"""Test initialisation and setup of 7-colour Inky.
Verify our expectations for GPIO setup in order to catch regressions.
"""
from inky.inky_uc8159 import Inky

# TODO: _busy_wait should timeout after N seconds
GPIO.input.return_value = GPIO.LOW
# _busy_wait will timeout after N seconds
# GPIO.input.return_value = GPIO.LOW

inky = Inky()
inky.setup()

# Check GPIO setup
GPIO.setwarnings.assert_called_with(False)
GPIO.setmode.assert_called_with(GPIO.BCM)
GPIO.setup.assert_has_calls([
mock.call(inky.dc_pin, GPIO.OUT, initial=GPIO.LOW, pull_up_down=GPIO.PUD_OFF),
mock.call(inky.reset_pin, GPIO.OUT, initial=GPIO.HIGH, pull_up_down=GPIO.PUD_OFF),
mock.call(inky.busy_pin, GPIO.IN, pull_up_down=GPIO.PUD_OFF)
])

# Check device will been reset
GPIO.output.assert_has_calls([
mock.call(inky.reset_pin, GPIO.LOW),
mock.call(inky.reset_pin, GPIO.HIGH)
])

# Check API will been opened
spidev.SpiDev().open.assert_called_with(0, inky.cs_channel)
19 changes: 2 additions & 17 deletions tests/test_install_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,33 +8,18 @@
import pytest


def test_mock_phat_no_tkinter():
def test_mock_phat_no_tkinter(PIL, nopath):
"""Test initialisation of InkyMockPHAT without tkinter."""
from inky import InkyMockPHAT

with pytest.raises(ImportError):
InkyMockPHAT('black')


def test_mock_what_no_tkinter():
def test_mock_what_no_tkinter(PIL, nopath):
"""Test initialisation of InkyMockWHAT without tkinter."""
from inky import InkyMockWHAT

with pytest.raises(ImportError):
InkyMockWHAT('black')


def test_mock_phat_no_pil(tkinter):
"""Test initialisation of InkyMockPHAT without PIL."""
from inky import InkyMockPHAT

with pytest.raises(ImportError):
InkyMockPHAT('black')


def test_mock_what_no_pil(tkinter):
"""Test initialisation of InkyMockWHAT without PIL."""
from inky import InkyMockWHAT

with pytest.raises(ImportError):
InkyMockWHAT('black')

0 comments on commit 0b50f4c

Please sign in to comment.