diff --git a/ironic_tempest_plugin/tests/api/admin/test_microversion_enforcement.py b/ironic_tempest_plugin/tests/api/admin/test_microversion_enforcement.py
new file mode 100644
index 0000000..4fd8c99
--- /dev/null
+++ b/ironic_tempest_plugin/tests/api/admin/test_microversion_enforcement.py
@@ -0,0 +1,82 @@
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+
+from tempest.lib import decorators
+from tempest.lib import exceptions as lib_exc
+
+from ironic_tempest_plugin.services.baremetal.v1.json.baremetal_client import \
+    BaremetalClient
+from ironic_tempest_plugin.tests.api.admin import api_microversion_fixture
+from ironic_tempest_plugin.tests.api import base
+
+
+class TestMicroversionEnforcement(base.BaseBaremetalTest):
+    """Tests for API microversion enforcement."""
+
+    def setUp(self):
+        super(TestMicroversionEnforcement, self).setUp()
+
+    def _microversion_test(
+            self, method_name, min_version, expected_error, required_args):
+        """Test methods with invalid API versions"""
+
+        major, minor = map(int, min_version.split('.'))
+        # Set limits, as lowest microversion is 1.1
+        if minor <= 10:
+            minor = 11
+        if minor <= 1:
+            minor = 2
+        invalid_versions = [
+            f"{major}.{minor - 1}",
+            f"{major}.{minor - 10}",
+        ]
+
+        # Get method name from method object
+        # This way, users can pass the method object,
+        # and we can still get the instantiated method
+        method_name = method_name.__name__
+
+        for microversion in invalid_versions:
+            for arg_name, arg_value in required_args.items():
+                msg = (
+                    f"Testing {method_name} with version {microversion} "
+                    f"and argument {arg_name}={arg_value}"
+                )
+                with self.subTest(
+                    msg=msg, method=method_name, version=microversion
+                ):
+                    self.useFixture(
+                        api_microversion_fixture.APIMicroversionFixture(
+                            microversion
+                        )
+                    )
+                    method = getattr(self.client, method_name)
+
+                    self.assertRaises(
+                        expected_error,
+                        method,
+                        **{arg_name: arg_value},
+                    )
+
+    @decorators.idempotent_id("e5403a31-e12b-4f97-a776-dcb819e5e9a0")
+    def test_shard(self):
+        self._microversion_test(
+            BaremetalClient.get_shards, "1.82", lib_exc.NotFound, {}
+        )
+
+    @decorators.idempotent_id("5df533c6-7a9c-4639-a47f-1377a2a87e6a")
+    def test_list_node_filter_shard(self):
+        self._microversion_test(
+            BaremetalClient.list_nodes, "1.82",
+            lib_exc.NotAcceptable, {"shard": "testshard"}
+        )
diff --git a/ironic_tempest_plugin/tests/api/admin/test_shards.py b/ironic_tempest_plugin/tests/api/admin/test_shards.py
index 8ad76c0..0638702 100644
--- a/ironic_tempest_plugin/tests/api/admin/test_shards.py
+++ b/ironic_tempest_plugin/tests/api/admin/test_shards.py
@@ -12,9 +12,7 @@
 
 from tempest import config
 from tempest.lib import decorators
-from tempest.lib import exceptions
 
-from ironic_tempest_plugin.tests.api.admin import api_microversion_fixture
 from ironic_tempest_plugin.tests.api import base
 
 
@@ -130,27 +128,6 @@
         self.assertIn(self.none_node_id, fetched_node_ids)
         self.assertNotIn(self.bad_node_id, fetched_node_ids)
 
-    @decorators.idempotent_id('77e36b09-308a-4fdf-bdac-d31d3b4c7c23')
-    def test_only_show_requested_shard_wrong_microversions(self):
-        """Test get node on shard filter fails on bad microversions.
-
-        Test that we get the correct error when using microversions
-        below the minimum supported.
-        """
-        shard = "oneshardtest"
-        self._setup_nodes(shard)
-
-        for microversion in ["1.37", "1.81"]:
-            self.useFixture(
-                api_microversion_fixture.APIMicroversionFixture(microversion)
-            )
-
-            self.assertRaises(
-                exceptions.NotAcceptable,
-                self.client.list_nodes,
-                shard=shard,
-            )
-
 
 class TestGetAllShards(base.BaseBaremetalTest):
     """Tests for baremetal shards."""
@@ -172,17 +149,3 @@
         fetched_shards = [shard['name'] for shard in fetched_shards['shards']]
 
         self.assertItemsEqual(self.shards, fetched_shards)
-
-    @decorators.idempotent_id('e9d5fd51-1419-4af2-9d6c-c317556c2096')
-    def test_get_shards_wrong_microversions(self):
-        """Test get shards fails on bad microversions.
-
-        Test that we get the correct error when using microversions
-        below the minimum supported.
-        """
-        for microversion in ["1.37", "1.81"]:
-            self.useFixture(
-                api_microversion_fixture.APIMicroversionFixture(microversion)
-            )
-            # Test microversion below minimum supported
-            self.assertRaises(exceptions.NotFound, self.client.get_shards)
