forked from esphome/esphome
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Unittests for esphome python code (esphome#931)
- Loading branch information
Showing
16 changed files
with
1,212 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
[run] | ||
omit = esphome/components/* |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
[pytest] | ||
addopts = | ||
--cov=esphome | ||
--cov-branch |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,4 +9,5 @@ set -x | |
script/ci-custom.py | ||
script/lint-python | ||
script/lint-cpp | ||
script/unit_test | ||
script/test |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
#!/usr/bin/env bash | ||
|
||
set -e | ||
|
||
cd "$(dirname "$0")/.." | ||
|
||
set -x | ||
|
||
pytest tests/unit_tests |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
""" | ||
ESPHome Unittests | ||
~~~~~~~~~~~~~~~~~ | ||
Configuration file for unit tests. | ||
If adding unit tests ensure that they are fast. Slower integration tests should | ||
not be part of a unit test suite. | ||
""" | ||
import sys | ||
import pytest | ||
|
||
from pathlib import Path | ||
|
||
|
||
here = Path(__file__).parent | ||
|
||
# Configure location of package root | ||
package_root = here.parent.parent | ||
sys.path.insert(0, package_root.as_posix()) | ||
|
||
|
||
@pytest.fixture | ||
def fixture_path() -> Path: | ||
""" | ||
Location of all fixture files. | ||
""" | ||
return here / "fixtures" | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
A files are unique. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
All b files match. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
All b files match. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
C files are unique. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
from typing import Text | ||
|
||
import hypothesis.strategies._internal.core as st | ||
from hypothesis.strategies._internal.strategies import SearchStrategy | ||
|
||
|
||
@st.defines_strategy_with_reusable_values | ||
def mac_addr_strings(): | ||
# type: () -> SearchStrategy[Text] | ||
"""A strategy for MAC address strings. | ||
This consists of six strings representing integers [0..255], | ||
without zero-padding, joined by dots. | ||
""" | ||
return st.builds("{:02X}:{:02X}:{:02X}:{:02X}:{:02X}:{:02X}".format, *(6 * [st.integers(0, 255)])) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
import pytest | ||
import string | ||
|
||
from hypothesis import given, example | ||
from hypothesis.strategies import one_of, text, integers, booleans, builds | ||
|
||
from esphome import config_validation | ||
from esphome.config_validation import Invalid | ||
from esphome.core import Lambda, HexInt | ||
|
||
|
||
def test_check_not_tamplatable__invalid(): | ||
with pytest.raises(Invalid, match="This option is not templatable!"): | ||
config_validation.check_not_templatable(Lambda("")) | ||
|
||
|
||
@given(one_of( | ||
booleans(), | ||
integers(), | ||
text(alphabet=string.ascii_letters + string.digits)), | ||
) | ||
def test_alphanumeric__valid(value): | ||
actual = config_validation.alphanumeric(value) | ||
|
||
assert actual == str(value) | ||
|
||
|
||
@given(value=text(alphabet=string.ascii_lowercase + string.digits + "_")) | ||
def test_valid_name__valid(value): | ||
actual = config_validation.valid_name(value) | ||
|
||
assert actual == value | ||
|
||
|
||
@pytest.mark.parametrize("value", ( | ||
"foo bar", "FooBar", "foo::bar" | ||
)) | ||
def test_valid_name__invalid(value): | ||
with pytest.raises(Invalid): | ||
config_validation.valid_name(value) | ||
|
||
|
||
@given(one_of(integers(), text())) | ||
def test_string__valid(value): | ||
actual = config_validation.string(value) | ||
|
||
assert actual == str(value) | ||
|
||
|
||
@pytest.mark.parametrize("value", ( | ||
{}, [], True, False, None | ||
)) | ||
def test_string__invalid(value): | ||
with pytest.raises(Invalid): | ||
config_validation.string(value) | ||
|
||
|
||
@given(text()) | ||
def test_strict_string__valid(value): | ||
actual = config_validation.string_strict(value) | ||
|
||
assert actual == value | ||
|
||
|
||
@pytest.mark.parametrize("value", (None, 123)) | ||
def test_string_string__invalid(value): | ||
with pytest.raises(Invalid, match="Must be string, got"): | ||
config_validation.string_strict(value) | ||
|
||
|
||
@given(builds(lambda v: "mdi:" + v, text())) | ||
@example("") | ||
def test_icon__valid(value): | ||
actual = config_validation.icon(value) | ||
|
||
assert actual == value | ||
|
||
|
||
def test_icon__invalid(): | ||
with pytest.raises(Invalid, match="Icons should start with prefix"): | ||
config_validation.icon("foo") | ||
|
||
|
||
@pytest.mark.parametrize("value", ( | ||
"True", "YES", "on", "enAblE", True | ||
)) | ||
def test_boolean__valid_true(value): | ||
assert config_validation.boolean(value) is True | ||
|
||
|
||
@pytest.mark.parametrize("value", ( | ||
"False", "NO", "off", "disAblE", False | ||
)) | ||
def test_boolean__valid_false(value): | ||
assert config_validation.boolean(value) is False | ||
|
||
|
||
@pytest.mark.parametrize("value", ( | ||
None, 1, 0, "foo" | ||
)) | ||
def test_boolean__invalid(value): | ||
with pytest.raises(Invalid, match="Expected boolean value"): | ||
config_validation.boolean(value) | ||
|
||
|
||
# TODO: ensure_list | ||
@given(integers()) | ||
def hex_int__valid(value): | ||
actual = config_validation.hex_int(value) | ||
|
||
assert isinstance(actual, HexInt) | ||
assert actual == value | ||
|
Oops, something went wrong.