xfstestsdb/tests/xunit/test_delete.py
Anna Schumaker 3366c1eb0c xfstestsdb: Add testcases from the xunit file to the database
I use the testcases table to store testcase information, and store
messages, system out, and system error logs in the messages table.

The testcases_view is used to link testcases with their source xunits,
messages, system out, and system error logs. This view has an INSTEAD
OF INSERT trigger to allow insertions that properly set up message ids
in the testcases table.

Signed-off-by: Anna Schumaker <anna@nowheycreamery.com>
2023-02-16 16:15:55 -05:00

88 lines
4.0 KiB
Python

# Copyright 2023 (c) Anna Schumaker.
"""Tests the `xfstestsdb xunit delete` command."""
import errno
import io
import unittest
import unittest.mock
import xfstestsdb.delete
import tests.xunit
class TestXunitDelete(unittest.TestCase):
"""Tests the `xfstestsdb xunit delete` command."""
def setUp(self):
"""Set up common variables."""
self.xfstestsdb = xfstestsdb.Command()
self.xunit = self.xfstestsdb.commands["xunit"]
self.delete = self.xunit.commands["delete"]
def test_init(self):
"""Check that the xunit delete command was set up properly."""
self.assertIsInstance(self.delete, xfstestsdb.commands.Command)
self.assertIsInstance(self.delete, xfstestsdb.xunit.delete.Command)
self.assertEqual(self.xunit.subparser.choices["delete"],
self.delete.parser)
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
def test_delete(self, mock_stdout: io.StringIO):
"""Test the `xfstestsdb xunit delete` command with valid input."""
self.xfstestsdb.run(["new", "/dev/test"])
self.xfstestsdb.run(["xunit", "read", "1", str(tests.xunit.XUNIT_1)])
self.xfstestsdb.run(["xunit", "delete", "1", tests.xunit.XUNIT_1.stem])
self.assertRegex(mock_stdout.getvalue(),
"run #1 xunit 'test-1' has been deleted")
cur = self.xfstestsdb.sql("SELECT COUNT(*) FROM xunits")
self.assertEqual(cur.fetchone()["COUNT(*)"], 0)
cur = self.xfstestsdb.sql("SELECT COUNT(*) FROM link_xunit_props")
self.assertEqual(cur.fetchone()["COUNT(*)"], 0)
cur = self.xfstestsdb.sql("SELECT COUNT(*) FROM xunit_properties")
self.assertEqual(cur.fetchone()["COUNT(*)"], 0)
cur = self.xfstestsdb.sql("SELECT COUNT(*) FROM testcases")
self.assertEqual(cur.fetchone()["COUNT(*)"], 0)
cur = self.xfstestsdb.sql("SELECT COUNT(*) FROM messages")
self.assertEqual(cur.fetchone()["COUNT(*)"], 0)
@unittest.mock.patch("sys.stdout", new_callable=io.StringIO)
def test_delete_testcase(self, mock_stdout: io.StringIO):
"""Test that messages get cleaned up when a testcase is deleted."""
self.xfstestsdb.run(["new", "/dev/test"])
self.xfstestsdb.run(["xunit", "read", "1", str(tests.xunit.XUNIT_1)])
self.xfstestsdb.sql("DELETE FROM testcases WHERE status=?", "skipped")
cur = self.xfstestsdb.sql("SELECT * FROM messages ORDER BY rowid")
self.assertListEqual([row["message"] for row in cur.fetchall()],
["- output mismatch (see somefile)",
"there was a problem with '$SCRATCH_DEV'",
"--- test/09.out\n" +
"+++ results/test/09.out.bad\n" +
"there was a problem with '$SCRATCH_MNT'"])
@unittest.mock.patch("sys.stderr", new_callable=io.StringIO)
def test_delete_error(self, mock_stderr: io.StringIO):
"""Test the `xfstestsdb xunit delete` command with invalid input."""
with self.assertRaises(SystemExit):
self.xfstestsdb.run(["xunit", "delete"])
self.assertRegex(mock_stderr.getvalue(),
"error: the following arguments are required: runid")
with self.assertRaises(SystemExit):
self.xfstestsdb.run(["xunit", "delete", "1"])
self.assertRegex(mock_stderr.getvalue(),
"error: the following arguments are required: name")
@unittest.mock.patch("sys.stderr", new_callable=io.StringIO)
def test_delete_enoent(self, mock_stderr: io.StringIO):
"""Test the `xfstestsdb delete` command with an invalid runid."""
with self.assertRaises(SystemExit) as sys_exit:
self.xfstestsdb.run(["xunit", "delete", "2", "test-1"])
self.assertEqual(sys_exit.exception.code, errno.ENOENT)
self.assertRegex(mock_stderr.getvalue(),
"error: either run #2 or xunit 'test-1' do not exist")