|
9 | 9 | from ee.onyx.db.license import check_seat_availability |
10 | 10 | from ee.onyx.db.license import delete_license |
11 | 11 | from ee.onyx.db.license import get_license |
| 12 | +from ee.onyx.db.license import get_used_seats |
12 | 13 | from ee.onyx.db.license import upsert_license |
13 | 14 | from ee.onyx.server.license.models import LicenseMetadata |
14 | 15 | from ee.onyx.server.license.models import LicenseSource |
@@ -214,3 +215,43 @@ def test_seats_full_multi_tenant( |
214 | 215 | assert result.available is False |
215 | 216 | assert result.error_message is not None |
216 | 217 | mock_tenant_count.assert_called_once_with("tenant-abc") |
| 218 | + |
| 219 | + |
| 220 | +class TestGetUsedSeatsAccountTypeFiltering: |
| 221 | + """Verify get_used_seats query excludes SERVICE_ACCOUNT but includes BOT.""" |
| 222 | + |
| 223 | + @patch("ee.onyx.db.license.MULTI_TENANT", False) |
| 224 | + @patch("onyx.db.engine.sql_engine.get_session_with_current_tenant") |
| 225 | + def test_excludes_service_accounts(self, mock_get_session: MagicMock) -> None: |
| 226 | + """SERVICE_ACCOUNT users should not count toward seats.""" |
| 227 | + mock_session = MagicMock() |
| 228 | + mock_get_session.return_value.__enter__ = MagicMock(return_value=mock_session) |
| 229 | + mock_get_session.return_value.__exit__ = MagicMock(return_value=False) |
| 230 | + mock_session.execute.return_value.scalar.return_value = 5 |
| 231 | + |
| 232 | + result = get_used_seats() |
| 233 | + |
| 234 | + assert result == 5 |
| 235 | + # Inspect the compiled query to verify account_type filter |
| 236 | + call_args = mock_session.execute.call_args |
| 237 | + query = call_args[0][0] |
| 238 | + compiled = str(query.compile(compile_kwargs={"literal_binds": True})) |
| 239 | + assert "SERVICE_ACCOUNT" in compiled |
| 240 | + # BOT should NOT be excluded |
| 241 | + assert "BOT" not in compiled |
| 242 | + |
| 243 | + @patch("ee.onyx.db.license.MULTI_TENANT", False) |
| 244 | + @patch("onyx.db.engine.sql_engine.get_session_with_current_tenant") |
| 245 | + def test_still_excludes_ext_perm_user(self, mock_get_session: MagicMock) -> None: |
| 246 | + """EXT_PERM_USER exclusion should still be present.""" |
| 247 | + mock_session = MagicMock() |
| 248 | + mock_get_session.return_value.__enter__ = MagicMock(return_value=mock_session) |
| 249 | + mock_get_session.return_value.__exit__ = MagicMock(return_value=False) |
| 250 | + mock_session.execute.return_value.scalar.return_value = 3 |
| 251 | + |
| 252 | + get_used_seats() |
| 253 | + |
| 254 | + call_args = mock_session.execute.call_args |
| 255 | + query = call_args[0][0] |
| 256 | + compiled = str(query.compile(compile_kwargs={"literal_binds": True})) |
| 257 | + assert "EXT_PERM_USER" in compiled |
0 commit comments