xfstestsdb/tests/testcase/test_list.py
Anna Schumaker 489c08e55c testcase: Create the xfstestsdb testcase list command
This command prints out information about the known testcases. It has
extra options to filter by runid, device, xunit, testcase, and status.

Implements: #11 (`xfstestsdb testcase list`)
Signed-off-by: Anna Schumaker <anna@nowheycreamery.com>
2023-02-16 16:15:56 -05:00

267 lines
12 KiB
Python

# Copyright 2023 (c) Anna Schumaker.
"""Tests the `xfstestsdb testcase list` command."""
import io
import unittest
import unittest.mock
import xfstestsdb.testcase.list
import tests.xunit
class TestTestCaseList(unittest.TestCase):
"""Tests the `xfstestsdb testcase list` command."""
def setUp(self):
"""Set up common variables."""
self.xfstestsdb = xfstestsdb.Command()
self.testcase = self.xfstestsdb.commands["testcase"]
self.list = self.testcase.commands["list"]
def setup_runs(self, mock_stdout: io.StringIO):
"""Set up runs in the database and clear stdout."""
self.xfstestsdb.run(["new", "/dev/vda1"])
self.xfstestsdb.run(["new", "/dev/vdb2"])
self.xfstestsdb.run(["xunit", "read", "1", str(tests.xunit.XUNIT_1)])
self.xfstestsdb.run(["xunit", "read", "2", str(tests.xunit.XUNIT_1),
"--name", "test-2"])
mock_stdout.seek(0)
mock_stdout.truncate(0)
def test_init(self):
"""Check that the testcase list command was set up properly."""
self.assertIsInstance(xfstestsdb.testcase.list.TestCaseTable(["col"]),
xfstestsdb.table.Table)
self.assertIsInstance(self.list, xfstestsdb.commands.Command)
self.assertIsInstance(self.list, xfstestsdb.testcase.list.Command)
self.assertEqual(self.testcase.subparser.choices["list"],
self.list.parser)
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
def test_list_empty(self, mock_stdout: io.StringIO):
"""Test printing out an empty list."""
self.xfstestsdb.run(["testcase", "list", "--color", "none"])
self.assertEqual(mock_stdout.getvalue(), "")
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
def test_list_testcases(self, mock_stdout: io.StringIO):
"""Test listing xunits with default options."""
self.setup_runs(mock_stdout)
print()
self.xfstestsdb.run(["testcase", "list", "--color", "none"])
self.assertEqual(mock_stdout.getvalue(),
"""
+-----+-----------+--------+----------+---------+------+
| run | device | xunit | testcase | status | time |
+-----+-----------+--------+----------+---------+------+
| 1 | /dev/vda1 | test-1 | test/01 | passed | 1 s |
| 1 | /dev/vda1 | test-1 | test/02 | skipped | 0 s |
| 1 | /dev/vda1 | test-1 | test/03 | skipped | 0 s |
| 1 | /dev/vda1 | test-1 | test/04 | passed | 4 s |
| 1 | /dev/vda1 | test-1 | test/05 | passed | 5 s |
| 1 | /dev/vda1 | test-1 | test/06 | passed | 6 s |
| 1 | /dev/vda1 | test-1 | test/07 | skipped | 0 s |
| 1 | /dev/vda1 | test-1 | test/08 | passed | 8 s |
| 1 | /dev/vda1 | test-1 | test/09 | failure | 9 s |
| 1 | /dev/vda1 | test-1 | test/10 | passed | 10 s |
| 2 | /dev/vdb2 | test-2 | test/01 | passed | 1 s |
| 2 | /dev/vdb2 | test-2 | test/02 | skipped | 0 s |
| 2 | /dev/vdb2 | test-2 | test/03 | skipped | 0 s |
| 2 | /dev/vdb2 | test-2 | test/04 | passed | 4 s |
| 2 | /dev/vdb2 | test-2 | test/05 | passed | 5 s |
| 2 | /dev/vdb2 | test-2 | test/06 | passed | 6 s |
| 2 | /dev/vdb2 | test-2 | test/07 | skipped | 0 s |
| 2 | /dev/vdb2 | test-2 | test/08 | passed | 8 s |
| 2 | /dev/vdb2 | test-2 | test/09 | failure | 9 s |
| 2 | /dev/vdb2 | test-2 | test/10 | passed | 10 s |
+-----+-----------+--------+----------+---------+------+
""")
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
def test_list_filter_run(self, mock_stdout: io.StringIO):
"""Test listing testcases beloging to a specific run."""
self.setup_runs(mock_stdout)
print()
self.xfstestsdb.run(["testcase", "list", "--runid", "1",
"--color", "none"])
self.assertEqual(mock_stdout.getvalue(),
"""
+-----+-----------+--------+----------+---------+------+
| run | device | xunit | testcase | status | time |
+-----+-----------+--------+----------+---------+------+
| 1 | /dev/vda1 | test-1 | test/01 | passed | 1 s |
| 1 | /dev/vda1 | test-1 | test/02 | skipped | 0 s |
| 1 | /dev/vda1 | test-1 | test/03 | skipped | 0 s |
| 1 | /dev/vda1 | test-1 | test/04 | passed | 4 s |
| 1 | /dev/vda1 | test-1 | test/05 | passed | 5 s |
| 1 | /dev/vda1 | test-1 | test/06 | passed | 6 s |
| 1 | /dev/vda1 | test-1 | test/07 | skipped | 0 s |
| 1 | /dev/vda1 | test-1 | test/08 | passed | 8 s |
| 1 | /dev/vda1 | test-1 | test/09 | failure | 9 s |
| 1 | /dev/vda1 | test-1 | test/10 | passed | 10 s |
+-----+-----------+--------+----------+---------+------+
""")
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
def test_list_filter_device(self, mock_stdout: io.StringIO):
"""Test listing testcases matching a device pattern."""
self.setup_runs(mock_stdout)
print()
self.xfstestsdb.run(["testcase", "list", "--device", "*vdb*",
"--color", "none"])
self.assertEqual(mock_stdout.getvalue(),
"""
+-----+-----------+--------+----------+---------+------+
| run | device | xunit | testcase | status | time |
+-----+-----------+--------+----------+---------+------+
| 2 | /dev/vdb2 | test-2 | test/01 | passed | 1 s |
| 2 | /dev/vdb2 | test-2 | test/02 | skipped | 0 s |
| 2 | /dev/vdb2 | test-2 | test/03 | skipped | 0 s |
| 2 | /dev/vdb2 | test-2 | test/04 | passed | 4 s |
| 2 | /dev/vdb2 | test-2 | test/05 | passed | 5 s |
| 2 | /dev/vdb2 | test-2 | test/06 | passed | 6 s |
| 2 | /dev/vdb2 | test-2 | test/07 | skipped | 0 s |
| 2 | /dev/vdb2 | test-2 | test/08 | passed | 8 s |
| 2 | /dev/vdb2 | test-2 | test/09 | failure | 9 s |
| 2 | /dev/vdb2 | test-2 | test/10 | passed | 10 s |
+-----+-----------+--------+----------+---------+------+
""")
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
def test_list_filter_xunit(self, mock_stdout: io.StringIO):
"""Test listing testcases matching an xunit pattern."""
self.setup_runs(mock_stdout)
print()
self.xfstestsdb.run(["testcase", "list", "--xunit", "*1",
"--color", "none"])
self.assertEqual(mock_stdout.getvalue(),
"""
+-----+-----------+--------+----------+---------+------+
| run | device | xunit | testcase | status | time |
+-----+-----------+--------+----------+---------+------+
| 1 | /dev/vda1 | test-1 | test/01 | passed | 1 s |
| 1 | /dev/vda1 | test-1 | test/02 | skipped | 0 s |
| 1 | /dev/vda1 | test-1 | test/03 | skipped | 0 s |
| 1 | /dev/vda1 | test-1 | test/04 | passed | 4 s |
| 1 | /dev/vda1 | test-1 | test/05 | passed | 5 s |
| 1 | /dev/vda1 | test-1 | test/06 | passed | 6 s |
| 1 | /dev/vda1 | test-1 | test/07 | skipped | 0 s |
| 1 | /dev/vda1 | test-1 | test/08 | passed | 8 s |
| 1 | /dev/vda1 | test-1 | test/09 | failure | 9 s |
| 1 | /dev/vda1 | test-1 | test/10 | passed | 10 s |
+-----+-----------+--------+----------+---------+------+
""")
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
def test_list_filter_testcase(self, mock_stdout: io.StringIO):
"""Test listing testcases matching a specific pattern."""
self.setup_runs(mock_stdout)
print()
self.xfstestsdb.run(["testcase", "list", "--testcase", "test*1*",
"--color", "none"])
self.assertEqual(mock_stdout.getvalue(),
"""
+-----+-----------+--------+----------+--------+------+
| run | device | xunit | testcase | status | time |
+-----+-----------+--------+----------+--------+------+
| 1 | /dev/vda1 | test-1 | test/01 | passed | 1 s |
| 1 | /dev/vda1 | test-1 | test/10 | passed | 10 s |
| 2 | /dev/vdb2 | test-2 | test/01 | passed | 1 s |
| 2 | /dev/vdb2 | test-2 | test/10 | passed | 10 s |
+-----+-----------+--------+----------+--------+------+
""")
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
def test_list_filter_passed(self, mock_stdout: io.StringIO):
"""Test listing testcases that passed."""
self.setup_runs(mock_stdout)
print()
self.xfstestsdb.run(["testcase", "list", "--passed",
"--color", "none"])
self.assertEqual(mock_stdout.getvalue(),
"""
+-----+-----------+--------+----------+--------+------+
| run | device | xunit | testcase | status | time |
+-----+-----------+--------+----------+--------+------+
| 1 | /dev/vda1 | test-1 | test/01 | passed | 1 s |
| 1 | /dev/vda1 | test-1 | test/04 | passed | 4 s |
| 1 | /dev/vda1 | test-1 | test/05 | passed | 5 s |
| 1 | /dev/vda1 | test-1 | test/06 | passed | 6 s |
| 1 | /dev/vda1 | test-1 | test/08 | passed | 8 s |
| 1 | /dev/vda1 | test-1 | test/10 | passed | 10 s |
| 2 | /dev/vdb2 | test-2 | test/01 | passed | 1 s |
| 2 | /dev/vdb2 | test-2 | test/04 | passed | 4 s |
| 2 | /dev/vdb2 | test-2 | test/05 | passed | 5 s |
| 2 | /dev/vdb2 | test-2 | test/06 | passed | 6 s |
| 2 | /dev/vdb2 | test-2 | test/08 | passed | 8 s |
| 2 | /dev/vdb2 | test-2 | test/10 | passed | 10 s |
+-----+-----------+--------+----------+--------+------+
""")
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
def test_list_filter_skipped(self, mock_stdout: io.StringIO):
"""Test listing testcases that were skipped."""
self.setup_runs(mock_stdout)
print()
self.xfstestsdb.run(["testcase", "list", "--skipped",
"--color", "none"])
self.assertEqual(mock_stdout.getvalue(),
"""
+-----+-----------+--------+----------+---------+------+
| run | device | xunit | testcase | status | time |
+-----+-----------+--------+----------+---------+------+
| 1 | /dev/vda1 | test-1 | test/02 | skipped | 0 s |
| 1 | /dev/vda1 | test-1 | test/03 | skipped | 0 s |
| 1 | /dev/vda1 | test-1 | test/07 | skipped | 0 s |
| 2 | /dev/vdb2 | test-2 | test/02 | skipped | 0 s |
| 2 | /dev/vdb2 | test-2 | test/03 | skipped | 0 s |
| 2 | /dev/vdb2 | test-2 | test/07 | skipped | 0 s |
+-----+-----------+--------+----------+---------+------+
""")
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
def test_list_filter_failure(self, mock_stdout: io.StringIO):
"""Test listing testcases that failed."""
self.setup_runs(mock_stdout)
print()
self.xfstestsdb.run(["testcase", "list", "--failure",
"--color", "none"])
self.assertEqual(mock_stdout.getvalue(),
"""
+-----+-----------+--------+----------+---------+------+
| run | device | xunit | testcase | status | time |
+-----+-----------+--------+----------+---------+------+
| 1 | /dev/vda1 | test-1 | test/09 | failure | 9 s |
| 2 | /dev/vdb2 | test-2 | test/09 | failure | 9 s |
+-----+-----------+--------+----------+---------+------+
""")
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
def test_list_filter_pass_fail(self, mock_stdout: io.StringIO):
"""Test listing testcases that passed and failed."""
self.setup_runs(mock_stdout)
print()
self.xfstestsdb.run(["testcase", "list", "--passed", "--failure",
"--color", "none"])
self.assertEqual(mock_stdout.getvalue(),
"""
+-----+-----------+--------+----------+---------+------+
| run | device | xunit | testcase | status | time |
+-----+-----------+--------+----------+---------+------+
| 1 | /dev/vda1 | test-1 | test/01 | passed | 1 s |
| 1 | /dev/vda1 | test-1 | test/04 | passed | 4 s |
| 1 | /dev/vda1 | test-1 | test/05 | passed | 5 s |
| 1 | /dev/vda1 | test-1 | test/06 | passed | 6 s |
| 1 | /dev/vda1 | test-1 | test/08 | passed | 8 s |
| 1 | /dev/vda1 | test-1 | test/09 | failure | 9 s |
| 1 | /dev/vda1 | test-1 | test/10 | passed | 10 s |
| 2 | /dev/vdb2 | test-2 | test/01 | passed | 1 s |
| 2 | /dev/vdb2 | test-2 | test/04 | passed | 4 s |
| 2 | /dev/vdb2 | test-2 | test/05 | passed | 5 s |
| 2 | /dev/vdb2 | test-2 | test/06 | passed | 6 s |
| 2 | /dev/vdb2 | test-2 | test/08 | passed | 8 s |
| 2 | /dev/vdb2 | test-2 | test/09 | failure | 9 s |
| 2 | /dev/vdb2 | test-2 | test/10 | passed | 10 s |
+-----+-----------+--------+----------+---------+------+
""")