From f5143327b243fc616f37252d76bd31f2690b088d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diego=20Elio=20Petten=C3=B2?= Date: Mon, 16 Mar 2020 18:51:27 +0000 Subject: Move tests to be organized within the source directory. This should simplify maintaining the tests in the long run, and allows mypy to more thoroughly check for types. --- glucometerutils/drivers/tests/__init__.py | 0 glucometerutils/drivers/tests/test_contourusb.py | 114 ++++++++++++++++++++++ glucometerutils/drivers/tests/test_fsoptium.py | 32 ++++++ glucometerutils/drivers/tests/test_otultra2.py | 43 ++++++++ glucometerutils/drivers/tests/test_otultraeasy.py | 23 +++++ glucometerutils/drivers/tests/test_td4277.py | 28 ++++++ 6 files changed, 240 insertions(+) create mode 100644 glucometerutils/drivers/tests/__init__.py create mode 100644 glucometerutils/drivers/tests/test_contourusb.py create mode 100644 glucometerutils/drivers/tests/test_fsoptium.py create mode 100644 glucometerutils/drivers/tests/test_otultra2.py create mode 100644 glucometerutils/drivers/tests/test_otultraeasy.py create mode 100644 glucometerutils/drivers/tests/test_td4277.py (limited to 'glucometerutils/drivers') diff --git a/glucometerutils/drivers/tests/__init__.py b/glucometerutils/drivers/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/glucometerutils/drivers/tests/test_contourusb.py b/glucometerutils/drivers/tests/test_contourusb.py new file mode 100644 index 0000000..3b8b547 --- /dev/null +++ b/glucometerutils/drivers/tests/test_contourusb.py @@ -0,0 +1,114 @@ +# -*- coding: utf-8 -*- +# +# SPDX-License-Identifier: MIT +"""Tests for the common ContourUSB functions..""" + +# pylint: disable=protected-access,missing-docstring + +from unittest.mock import Mock + +from absl.testing import absltest +from glucometerutils.support import contourusb + + +class TestContourUSB(absltest.TestCase): + + header_record = b"\x04\x021H|\\^&||7w3LBL|Bayer7390^01.24\\01.04\\09.02.20^7390-2336773^7403-|A=1^C=63^G=1^I=0200^R=0^S=1^U=0^V=10600^X=070070070070180130150250^Y=360126090050099050300089^Z=1|1714||||||1|201909221304\r\x17D7\r\n\x05" + + mock_dev = Mock() + + def test_get_datetime(self): + import datetime + + self.datetime = "201908071315" # returned by + self.assertEqual( + datetime.datetime(2019, 8, 7, 13, 15), + contourusb.ContourHidDevice.get_datetime(self), + ) + + def test_RECORD_FORMAT_match(self): + # first decode the header record frame + header_record_decoded = self.header_record.decode() + stx = header_record_decoded.find("\x02") + + _RECORD_FORMAT = contourusb._RECORD_FORMAT + result = _RECORD_FORMAT.match(header_record_decoded[stx:]).group("text") + + self.assertEqual( + "H|\\^&||7w3LBL|Bayer7390^01.24\\01.04\\09.02.20^7390-2336773^7403-|A=1^C=63^G=1^I=0200^R=0^S=1^U=0^V=10600^X=070070070070180130150250^Y=360126090050099050300089^Z=1|1714||||||1|201909221304", + result, + ) + + def test_parse_header_record(self): + + _HEADER_RECORD_RE = contourusb._HEADER_RECORD_RE + _RECORD_FORMAT = contourusb._RECORD_FORMAT + + header_record_decoded = self.header_record.decode() + stx = header_record_decoded.find("\x02") + + result = _RECORD_FORMAT.match(header_record_decoded[stx:]).group("text") + contourusb.ContourHidDevice.parse_header_record(self.mock_dev, result) + + self.assertEqual(self.mock_dev.field_del, "\\") + self.assertEqual(self.mock_dev.repeat_del, "^") + self.assertEqual(self.mock_dev.component_del, "&") + self.assertEqual(self.mock_dev.escape_del, "|") + + self.assertEqual(self.mock_dev.product_code, "Bayer7390") + + self.assertEqual(self.mock_dev.dig_ver, "01.24") + self.assertEqual(self.mock_dev.anlg_ver, "01.04") + self.assertEqual(self.mock_dev.agp_ver, "09.02.20") + self.assertEqual(self.mock_dev.serial_num, "7390-2336773") + self.assertEqual(self.mock_dev.sku_id, "7403-") + self.assertEqual(self.mock_dev.res_marking, "1") + self.assertEqual(self.mock_dev.config_bits, "63") + self.assertEqual(self.mock_dev.lang, "1") + self.assertEqual(self.mock_dev.interv, "0200") + self.assertEqual(self.mock_dev.ref_method, "0") + self.assertEqual(self.mock_dev.internal, "1") + self.assertEqual(self.mock_dev.unit, "0") + self.assertEqual(self.mock_dev.lo_bound, "10") + self.assertEqual(self.mock_dev.hi_bound, "600") + + self.assertEqual(self.mock_dev.hypo_limit, "070") + self.assertEqual(self.mock_dev.overall_low, "070") + self.assertEqual(self.mock_dev.pre_food_low, "070") + self.assertEqual(self.mock_dev.post_food_low, "070") + self.assertEqual(self.mock_dev.overall_high, "180") + self.assertEqual(self.mock_dev.pre_food_high, "130") + self.assertEqual(self.mock_dev.post_food_high, "150") + self.assertEqual(self.mock_dev.hyper_limit, "250") + + self.assertEqual(self.mock_dev.upp_hyper, "360") + self.assertEqual(self.mock_dev.low_hyper, "126") + self.assertEqual(self.mock_dev.upp_hypo, "090") + self.assertEqual(self.mock_dev.low_hypo, "050") + self.assertEqual(self.mock_dev.upp_low_target, "099") + self.assertEqual(self.mock_dev.low_low_target, "050") + self.assertEqual(self.mock_dev.upp_hi_target, "300") + self.assertEqual(self.mock_dev.low_hi_target, "089") + self.assertEqual(self.mock_dev.trends, "1") + self.assertEqual(self.mock_dev.total, "1714") + self.assertEqual(self.mock_dev.spec_ver, "1") + + self.assertEqual(self.mock_dev.datetime, "201909221304") + + # TO-DO checksum and checkframe unit tests + + def test_parse_result_record(self): + # first decode the header record frame + result_record = "R|8|^^^Glucose|133|mg/dL^P||B/X||201202052034" + result_dict = contourusb.ContourHidDevice.parse_result_record( + self.mock_dev, result_record + ) + + self.assertEqual(result_dict["record_type"], "R") + self.assertEqual(result_dict["seq_num"], "8") + self.assertEqual(result_dict["test_id"], "Glucose") + self.assertEqual(result_dict["value"], "133") + self.assertEqual(result_dict["unit"], "mg/dL") + self.assertEqual(result_dict["ref_method"], "P") + self.assertEqual(result_dict["markers"], "B/X") + self.assertEqual(result_dict["datetime"], "201202052034") diff --git a/glucometerutils/drivers/tests/test_fsoptium.py b/glucometerutils/drivers/tests/test_fsoptium.py new file mode 100644 index 0000000..bdc76f8 --- /dev/null +++ b/glucometerutils/drivers/tests/test_fsoptium.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# +# SPDX-License-Identifier: MIT +"""Tests for the FreeStyle Optium driver.""" + +# pylint: disable=protected-access,missing-docstring + +import datetime + +from absl.testing import parameterized +from glucometerutils import exceptions +from glucometerutils.drivers import fsoptium + + +class TestFreeStyleOptium(parameterized.TestCase): + @parameterized.parameters( + ("Clock:\tApr 22 2014\t02:14:37", datetime.datetime(2014, 4, 22, 2, 14, 37)), + ("Clock:\tJul 10 2013\t14:26:44", datetime.datetime(2013, 7, 10, 14, 26, 44)), + ("Clock:\tSep 29 2013\t17:35:34", datetime.datetime(2013, 9, 29, 17, 35, 34)), + ) + def test_parse_clock(self, datestr, datevalue): + self.assertEqual(fsoptium._parse_clock(datestr), datevalue) + + @parameterized.parameters( + ("Apr 22 2014 02:14:37",), + ("Clock:\tXxx 10 2013\t14:26",), + ("Clock:\tSep 29 2013\t17:35:22.34",), + ("Foo",), + ) + def test_parse_clock_invalid(self, datestr): + with self.assertRaises(exceptions.InvalidResponse): + fsoptium._parse_clock(datestr) diff --git a/glucometerutils/drivers/tests/test_otultra2.py b/glucometerutils/drivers/tests/test_otultra2.py new file mode 100644 index 0000000..6b36602 --- /dev/null +++ b/glucometerutils/drivers/tests/test_otultra2.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# +# SPDX-License-Identifier: MIT +"""Tests for the LifeScan OneTouch Ultra 2 driver.""" + +# pylint: disable=protected-access,missing-docstring + +from unittest import mock + +from absl.testing import parameterized +from glucometerutils import exceptions +from glucometerutils.drivers import otultra2 +from glucometerutils.support import lifescan + + +class TestOTUltra2(parameterized.TestCase): + def test_checksum(self): + checksum = otultra2._calculate_checksum(b"T") + self.assertEqual(0x0054, checksum) + + def test_checksum_full(self): + checksum = otultra2._calculate_checksum(b'T "SAT","08/03/13","22:12:00 "') + self.assertEqual(0x0608, checksum) + + @parameterized.named_parameters( + ("_missing_checksum", b"INVALID", lifescan.MissingChecksum), + ("_short", b".\r", exceptions.InvalidResponse), + ("_generic", b"% 2500\r", exceptions.InvalidResponse), + ( + "_invalid_serial_number", + b'@ "12345678O" 0297\r', + lifescan.InvalidSerialNumber, + ), + ("_invalid_checksum", b"% 1337\r", exceptions.InvalidChecksum), + ("_broken_checksum", b"% 13AZ\r", lifescan.MissingChecksum), + ) + def test_invalid_response(self, returned_string, expected_exception): + with mock.patch("serial.Serial") as mock_serial: + mock_serial.return_value.readline.return_value = returned_string + + device = otultra2.Device("mockdevice") + with self.assertRaises(expected_exception): + device.get_serial_number() diff --git a/glucometerutils/drivers/tests/test_otultraeasy.py b/glucometerutils/drivers/tests/test_otultraeasy.py new file mode 100644 index 0000000..c6fce83 --- /dev/null +++ b/glucometerutils/drivers/tests/test_otultraeasy.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# SPDX-License-Identifier: MIT +"""Tests for the LifeScan OneTouch Ultra Easy driver.""" + +# pylint: disable=protected-access,missing-docstring + +from absl.testing import absltest +from glucometerutils.drivers import otultraeasy + + +class ConstructTest(absltest.TestCase): + def test_make_packet_ack(self): + self.assertEqual( + b"\x02\x06\x08\x03\xc2\x62", + otultraeasy._make_packet(b"", False, False, False, True), + ) + + def test_make_packet_version_request(self): + self.assertEqual( + b"\x02\x09\x03\x05\x0d\x02\x03\x08\x9f", + otultraeasy._make_packet(b"\x05\x0d\x02", True, True, False, False), + ) diff --git a/glucometerutils/drivers/tests/test_td4277.py b/glucometerutils/drivers/tests/test_td4277.py new file mode 100644 index 0000000..fbd4aa2 --- /dev/null +++ b/glucometerutils/drivers/tests/test_td4277.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# +# SPDX-License-Identifier: MIT +"""Tests for the TD-4277 driver.""" + +# pylint: disable=protected-access,missing-docstring + +import datetime + +from absl.testing import parameterized +from glucometerutils import exceptions +from glucometerutils.drivers import td4277 +from glucometerutils.support import lifescan + + +class TestTD4277Nexus(parameterized.TestCase): + @parameterized.parameters( + (b"\x21\x24\x0e\x15", datetime.datetime(2018, 1, 1, 21, 14)), + (b"\x21\x26\x0e\x15", datetime.datetime(2019, 1, 1, 21, 14)), + (b"\x04\x27\x25\x0d", datetime.datetime(2019, 8, 4, 13, 37)), + ) + def test_parse_datetime(self, message, date): + self.assertEqual(td4277._parse_datetime(message), date) + + def test_making_message(self): + self.assertEqual( + td4277._make_packet(0x22, 0), b"\x51\x22\x00\x00\x00\x00\xa3\x16" + ) -- cgit v1.2.3