|
3 | 3 | import unittest
|
4 | 4 | from unittest.mock import MagicMock
|
5 | 5 |
|
| 6 | +import pytest |
6 | 7 | import redis
|
7 | 8 |
|
8 | 9 | from pymodbus.datastore import (
|
@@ -308,154 +309,184 @@ def __init__(self, rowcount=0, value=0):
|
308 | 309 | class SqlDataStoreTest(unittest.TestCase):
|
309 | 310 | """Unittest for the pymodbus.datastore.database.SqlSlaveContext module."""
|
310 | 311 |
|
| 312 | + class SQLunit: # pylint: disable=too-few-public-methods |
| 313 | + """Single test setup.""" |
| 314 | + |
| 315 | + def __init__(self): |
| 316 | + """Prepare test.""" |
| 317 | + self.slave = SqlSlaveContext() |
| 318 | + self.slave._metadata.drop_all = MagicMock() |
| 319 | + self.slave._db_create = MagicMock() |
| 320 | + self.slave._table.select = MagicMock() |
| 321 | + self.slave._connection = MagicMock() |
| 322 | + |
| 323 | + self.mock_addr = random.randint(0, 65000) # nosec |
| 324 | + self.mock_values = random.sample(range(1, 100), 5) # nosec |
| 325 | + self.mock_function = 0x01 |
| 326 | + self.mock_type = "h" |
| 327 | + self.mock_offset = 0 |
| 328 | + self.mock_count = 1 |
| 329 | + |
| 330 | + self.function_map = {2: "d", 4: "i"} |
| 331 | + self.function_map.update([(i, "h") for i in (3, 6, 16, 22, 23)]) |
| 332 | + self.function_map.update([(i, "c") for i in (1, 5, 15)]) |
| 333 | + |
311 | 334 | def setUp(self):
|
312 | 335 | """Do setup."""
|
313 |
| - self.slave = SqlSlaveContext() |
314 |
| - self.slave._metadata.drop_all = MagicMock() # pylint: disable=protected-access |
315 |
| - self.slave._db_create = MagicMock() # pylint: disable=protected-access |
316 |
| - self.slave._table.select = MagicMock() # pylint: disable=protected-access |
317 |
| - self.slave._connection = MagicMock() # pylint: disable=protected-access |
318 |
| - |
319 |
| - self.mock_addr = random.randint(0, 65000) # nosec |
320 |
| - self.mock_values = random.sample(range(1, 100), 5) # nosec |
321 |
| - self.mock_function = 0x01 |
322 |
| - self.mock_type = "h" |
323 |
| - self.mock_offset = 0 |
324 |
| - self.mock_count = 1 |
325 |
| - |
326 |
| - self.function_map = {2: "d", 4: "i"} |
327 |
| - self.function_map.update([(i, "h") for i in (3, 6, 16, 22, 23)]) |
328 |
| - self.function_map.update([(i, "c") for i in (1, 5, 15)]) |
329 | 336 |
|
330 | 337 | def tearDown(self):
|
331 | 338 | """Clean up the test environment"""
|
332 | 339 |
|
| 340 | + @pytest.mark.xdist_group(name="sql") |
333 | 341 | def test_str(self):
|
334 | 342 | """Test string."""
|
335 |
| - self.assertEqual(str(self.slave), "Modbus Slave Context") |
| 343 | + unit = self.SQLunit() |
| 344 | + self.assertEqual(str(unit.slave), "Modbus Slave Context") |
336 | 345 |
|
| 346 | + @pytest.mark.xdist_group(name="sql") |
337 | 347 | def test_reset(self):
|
338 | 348 | """Test reset."""
|
339 |
| - self.slave.reset() |
| 349 | + unit = self.SQLunit() |
| 350 | + unit.slave.reset() |
340 | 351 |
|
341 |
| - self.slave._metadata.drop_all.assert_called_once_with() # pylint: disable=protected-access |
342 |
| - self.slave._db_create.assert_called_once_with( # pylint: disable=protected-access |
343 |
| - self.slave.table, self.slave.database |
| 352 | + unit.slave._metadata.drop_all.assert_called_once_with() # pylint: disable=protected-access |
| 353 | + unit.slave._db_create.assert_called_once_with( # pylint: disable=protected-access |
| 354 | + unit.slave.table, unit.slave.database |
344 | 355 | )
|
345 | 356 |
|
| 357 | + @pytest.mark.xdist_group(name="sql") |
346 | 358 | def test_validate_success(self):
|
347 | 359 | """Test validate success."""
|
348 |
| - self.slave._connection.execute.return_value.fetchall.return_value = ( # pylint: disable=protected-access |
349 |
| - self.mock_values |
| 360 | + unit = self.SQLunit() |
| 361 | + unit.slave._connection.execute.return_value.fetchall.return_value = ( # pylint: disable=protected-access |
| 362 | + unit.mock_values |
350 | 363 | )
|
351 | 364 | self.assertTrue(
|
352 |
| - self.slave.validate( |
353 |
| - self.mock_function, self.mock_addr, len(self.mock_values) |
| 365 | + unit.slave.validate( |
| 366 | + unit.mock_function, unit.mock_addr, len(unit.mock_values) |
354 | 367 | )
|
355 | 368 | )
|
356 | 369 |
|
| 370 | + @pytest.mark.xdist_group(name="sql") |
357 | 371 | def test_validate_failure(self):
|
358 | 372 | """Test validate failure."""
|
| 373 | + unit = self.SQLunit() |
359 | 374 | wrong_count = 9
|
360 |
| - self.slave._connection.execute.return_value.fetchall.return_value = ( # pylint: disable=protected-access |
361 |
| - self.mock_values |
| 375 | + unit.slave._connection.execute.return_value.fetchall.return_value = ( # pylint: disable=protected-access |
| 376 | + unit.mock_values |
362 | 377 | )
|
363 | 378 | self.assertFalse(
|
364 |
| - self.slave.validate(self.mock_function, self.mock_addr, wrong_count) |
| 379 | + unit.slave.validate(unit.mock_function, unit.mock_addr, wrong_count) |
365 | 380 | )
|
366 | 381 |
|
| 382 | + @pytest.mark.xdist_group(name="sql") |
367 | 383 | def test_build_set(self):
|
368 | 384 | """Test build set."""
|
| 385 | + unit = self.SQLunit() |
369 | 386 | mock_set = [
|
370 | 387 | {"index": 0, "type": "h", "value": 11},
|
371 | 388 | {"index": 1, "type": "h", "value": 12},
|
372 | 389 | ]
|
373 | 390 | self.assertListEqual(
|
374 |
| - self.slave._build_set("h", 0, [11, 12]), # pylint: disable=protected-access |
| 391 | + unit.slave._build_set("h", 0, [11, 12]), # pylint: disable=protected-access |
375 | 392 | mock_set,
|
376 | 393 | )
|
377 | 394 |
|
| 395 | + @pytest.mark.xdist_group(name="sql") |
378 | 396 | def test_check_success(self):
|
379 | 397 | """Test check success."""
|
| 398 | + unit = self.SQLunit() |
380 | 399 | mock_success_results = [1, 2, 3]
|
381 |
| - self.slave._get = MagicMock( # pylint: disable=protected-access |
| 400 | + unit.slave._get = MagicMock( # pylint: disable=protected-access |
382 | 401 | return_value=mock_success_results
|
383 | 402 | )
|
384 | 403 | self.assertFalse(
|
385 |
| - self.slave._check("h", 0, 1) # pylint: disable=protected-access |
| 404 | + unit.slave._check("h", 0, 1) # pylint: disable=protected-access |
386 | 405 | )
|
387 | 406 |
|
| 407 | + @pytest.mark.xdist_group(name="sql") |
388 | 408 | def test_check_failure(self):
|
389 | 409 | """Test check failure."""
|
| 410 | + unit = self.SQLunit() |
390 | 411 | mock_success_results = []
|
391 |
| - self.slave._get = MagicMock( # pylint: disable=protected-access |
| 412 | + unit.slave._get = MagicMock( # pylint: disable=protected-access |
392 | 413 | return_value=mock_success_results
|
393 | 414 | )
|
394 | 415 | self.assertTrue(
|
395 |
| - self.slave._check("h", 0, 1) # pylint: disable=protected-access |
| 416 | + unit.slave._check("h", 0, 1) # pylint: disable=protected-access |
396 | 417 | )
|
397 | 418 |
|
| 419 | + @pytest.mark.xdist_group(name="sql") |
398 | 420 | def test_get_values(self):
|
399 | 421 | """Test get values."""
|
400 |
| - self.slave._get = MagicMock() # pylint: disable=protected-access |
| 422 | + unit = self.SQLunit() |
| 423 | + unit.slave._get = MagicMock() # pylint: disable=protected-access |
401 | 424 |
|
402 |
| - for key, value in self.function_map.items(): |
403 |
| - self.slave.getValues(key, self.mock_addr, self.mock_count) |
404 |
| - self.slave._get.assert_called_with( # pylint: disable=protected-access |
405 |
| - value, self.mock_addr + 1, self.mock_count |
| 425 | + for key, value in unit.function_map.items(): |
| 426 | + unit.slave.getValues(key, unit.mock_addr, unit.mock_count) |
| 427 | + unit.slave._get.assert_called_with( # pylint: disable=protected-access |
| 428 | + value, unit.mock_addr + 1, unit.mock_count |
406 | 429 | )
|
407 | 430 |
|
| 431 | + @pytest.mark.xdist_group(name="sql") |
408 | 432 | def test_set_values(self):
|
409 | 433 | """Test set values."""
|
410 |
| - self.slave._set = MagicMock() # pylint: disable=protected-access |
| 434 | + unit = self.SQLunit() |
| 435 | + unit.slave._set = MagicMock() # pylint: disable=protected-access |
411 | 436 |
|
412 |
| - for key, value in self.function_map.items(): |
413 |
| - self.slave.setValues(key, self.mock_addr, self.mock_values, update=False) |
414 |
| - self.slave._set.assert_called_with( # pylint: disable=protected-access |
415 |
| - value, self.mock_addr + 1, self.mock_values |
| 437 | + for key, value in unit.function_map.items(): |
| 438 | + unit.slave.setValues(key, unit.mock_addr, unit.mock_values, update=False) |
| 439 | + unit.slave._set.assert_called_with( # pylint: disable=protected-access |
| 440 | + value, unit.mock_addr + 1, unit.mock_values |
416 | 441 | )
|
417 | 442 |
|
| 443 | + @pytest.mark.xdist_group(name="sql") |
418 | 444 | def test_set(self):
|
419 | 445 | """Test set."""
|
420 |
| - self.slave._check = MagicMock( # pylint: disable=protected-access |
| 446 | + unit = self.SQLunit() |
| 447 | + unit.slave._check = MagicMock( # pylint: disable=protected-access |
421 | 448 | return_value=True
|
422 | 449 | )
|
423 |
| - self.slave._connection.execute = MagicMock( # pylint: disable=protected-access |
424 |
| - return_value=MockSqlResult(rowcount=len(self.mock_values)) |
| 450 | + unit.slave._connection.execute = MagicMock( # pylint: disable=protected-access |
| 451 | + return_value=MockSqlResult(rowcount=len(unit.mock_values)) |
425 | 452 | )
|
426 | 453 | self.assertTrue(
|
427 |
| - self.slave._set( # pylint: disable=protected-access |
428 |
| - self.mock_type, self.mock_offset, self.mock_values |
| 454 | + unit.slave._set( # pylint: disable=protected-access |
| 455 | + unit.mock_type, unit.mock_offset, unit.mock_values |
429 | 456 | )
|
430 | 457 | )
|
431 | 458 |
|
432 |
| - self.slave._check = MagicMock( # pylint: disable=protected-access |
| 459 | + unit.slave._check = MagicMock( # pylint: disable=protected-access |
433 | 460 | return_value=False
|
434 | 461 | )
|
435 | 462 | self.assertFalse(
|
436 |
| - self.slave._set( # pylint: disable=protected-access |
437 |
| - self.mock_type, self.mock_offset, self.mock_values |
| 463 | + unit.slave._set( # pylint: disable=protected-access |
| 464 | + unit.mock_type, unit.mock_offset, unit.mock_values |
438 | 465 | )
|
439 | 466 | )
|
440 | 467 |
|
| 468 | + @pytest.mark.xdist_group(name="sql") |
441 | 469 | def test_update_success(self):
|
442 | 470 | """Test update success."""
|
443 |
| - self.slave._connection.execute = MagicMock( # pylint: disable=protected-access |
444 |
| - return_value=MockSqlResult(rowcount=len(self.mock_values)) |
| 471 | + unit = self.SQLunit() |
| 472 | + unit.slave._connection.execute = MagicMock( # pylint: disable=protected-access |
| 473 | + return_value=MockSqlResult(rowcount=len(unit.mock_values)) |
445 | 474 | )
|
446 | 475 | self.assertTrue(
|
447 |
| - self.slave._update( # pylint: disable=protected-access |
448 |
| - self.mock_type, self.mock_offset, self.mock_values |
| 476 | + unit.slave._update( # pylint: disable=protected-access |
| 477 | + unit.mock_type, unit.mock_offset, unit.mock_values |
449 | 478 | )
|
450 | 479 | )
|
451 | 480 |
|
| 481 | + @pytest.mark.xdist_group(name="sql") |
452 | 482 | def test_update_failure(self):
|
453 | 483 | """Test update failure."""
|
454 |
| - self.slave._connection.execute = MagicMock( # pylint: disable=protected-access |
| 484 | + unit = self.SQLunit() |
| 485 | + unit.slave._connection.execute = MagicMock( # pylint: disable=protected-access |
455 | 486 | return_value=MockSqlResult(rowcount=100)
|
456 | 487 | )
|
457 | 488 | self.assertFalse(
|
458 |
| - self.slave._update( # pylint: disable=protected-access |
459 |
| - self.mock_type, self.mock_offset, self.mock_values |
| 489 | + unit.slave._update( # pylint: disable=protected-access |
| 490 | + unit.mock_type, unit.mock_offset, unit.mock_values |
460 | 491 | )
|
461 | 492 | )
|
0 commit comments