|
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