Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nixosTests.home-assistant: port to python #74126

Closed

Conversation

Br1ght0ne
Copy link
Member

@Br1ght0ne Br1ght0ne commented Nov 25, 2019

Motivation for this change

#72828

Things done
  • Tested using sandboxing (nix.useSandbox on NixOS, or option sandbox in nix.conf on non-NixOS linux)
  • Built on platform(s)
    • NixOS
    • macOS
    • other Linux distributions
  • Tested via one or more NixOS test(s) if existing and applicable for the change (look inside nixos/tests)
  • Tested compilation of all pkgs that depend on this change using nix-shell -p nix-review --run "nix-review wip"
  • Tested execution of all binary files (usually in ./result/bin/)
  • Determined the impact on package closure size (by running nix path-info -S before and after)
  • Ensured that relevant documentation is up to date
  • Fits CONTRIBUTING.md.
Notify maintainers

cc @dotlambda


This change is Reviewable

@Br1ght0ne
Copy link
Member Author

@GrahamcOfBorg test home-assistant

nixos/tests/home-assistant.nix Outdated Show resolved Hide resolved
nixos/tests/home-assistant.nix Outdated Show resolved Hide resolved
@Br1ght0ne
Copy link
Member Author

@tfc Thanks for the review!

@Br1ght0ne
Copy link
Member Author

@GrahamcOfBorg test home-assistant

@Mic92
Copy link
Member

Mic92 commented Dec 1, 2019

@GrahamcOfBorg test home-assistant

@Mic92 Mic92 mentioned this pull request Dec 1, 2019
10 tasks
@Mic92
Copy link
Member

Mic92 commented Dec 10, 2019

@GrahamcOfBorg test home-assistant

@Br1ght0ne Br1ght0ne force-pushed the nixosTests.home-assistant-python branch from ba18a85 to 73160c0 Compare December 10, 2019 10:38
@Br1ght0ne Br1ght0ne requested a review from Mic92 December 10, 2019 10:38
@Br1ght0ne
Copy link
Member Author

@GrahamcOfBorg test home-assistant

@Mic92
Copy link
Member

Mic92 commented Dec 10, 2019

You can fix the format issues by copying the python code to a dedicated file and use black to format it before copying it back into the file.

nixosTests.home-assistant: use subtests
@Br1ght0ne Br1ght0ne force-pushed the nixosTests.home-assistant-python branch from 73160c0 to 631cbc3 Compare December 10, 2019 12:45
@Br1ght0ne
Copy link
Member Author

@Mic92 Thanks for the suggestion!
@GrahamcOfBorg test home-assistant

@jonringer jonringer mentioned this pull request Dec 20, 2019
10 tasks
@Mic92
Copy link
Member

Mic92 commented Dec 21, 2019

@GrahamcOfBorg test home-assistant

"${hassCli} --output json state get binary_sensor.mqtt_binary_sensor"
)
hass.succeed(
"${hassCli} state edit binary_sensor.mqtt_binary_sensor --json=\'{"state": "off"}\'"
Copy link
Contributor

@makefu makefu Dec 30, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you've got some typo there:

Suggested change
"${hassCli} state edit binary_sensor.mqtt_binary_sensor --json=\'{"state": "off"}\'"
"${hassCli} state edit binary_sensor.mqtt_binary_sensor --json='{\"state\": \"off\"}'"

hass.wait_until_succeeds(
"mosquitto_pub -V mqttv311 -t home-assistant/test -u homeassistant -P '${mqttPassword}' -m let_there_be_light"
)
assert '"state": "off"' in hass.succeed(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should be :

Suggested change
assert '"state": "off"' in hass.succeed(
assert '"state": "on"' in hass.succeed(

# Check that no errors were logged
$hass->fail("cat ${configDir}/home-assistant.log | grep -qF ERROR");
with subtest("Check that no errors were logged"):
assert "ERROR" not in log
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this will work:

    with subtest("Print log to ease debugging"):
        print("\n### home-assistant.log ###\n")
        print(hass.succeed("cat ${configDir}/home-assistant.log"))

    with subtest("Check that no errors were logged"):
        assert "ERROR" not in hass.succeed("cat ${configDir}/home-assistant.log")

@makefu
Copy link
Contributor

makefu commented Dec 30, 2019

The complete working file:

import ./make-test-python.nix ({ pkgs, ... }:

let
  configDir = "/var/lib/foobar";
  apiPassword = "some_secret";
  mqttPassword = "another_secret";
  hassCli = "hass-cli --server http://hass:8123 --password '${apiPassword}'";

in {
  name = "home-assistant";
  meta = with pkgs.stdenv.lib; {
    maintainers = with maintainers; [ dotlambda ];
  };

  nodes = {
    hass =
      { pkgs, ... }:
      {
        environment.systemPackages = with pkgs; [
          mosquitto home-assistant-cli
        ];
        services.home-assistant = {
          inherit configDir;
          enable = true;
          package = pkgs.home-assistant.override {
            extraPackages = ps: with ps; [ hbmqtt ];
          };
          config = {
            homeassistant = {
              name = "Home";
              time_zone = "UTC";
              latitude = "0.0";
              longitude = "0.0";
              elevation = 0;
              auth_providers = [
                {
                  type = "legacy_api_password";
                  api_password = apiPassword;
                }
              ];
            };
            frontend = { };
            mqtt = { # Use hbmqtt as broker
              password = mqttPassword;
            };
            binary_sensor = [
              {
                platform = "mqtt";
                state_topic = "home-assistant/test";
                payload_on = "let_there_be_light";
                payload_off = "off";
              }
            ];
          };
          lovelaceConfig = {
            title = "My Awesome Home";
            views = [ {
              title = "Example";
              cards = [ {
                type = "markdown";
                title = "Lovelace";
                content = "Welcome to your **Lovelace UI**.";
              } ];
            } ];
          };
          lovelaceConfigWritable = true;
        };
      };
  };

  testScript = ''
    start_all()
    hass.wait_for_unit("home-assistant.service")
    with subtest("Check that YAML configuration file is in place"):
        hass.succeed("test -L ${configDir}/configuration.yaml")
    with subtest("lovelace config is copied because lovelaceConfigWritable = true"):
        hass.succeed("test -f ${configDir}/ui-lovelace.yaml")
    with subtest("Check that Home Assistant's web interface and API can be reached"):
        hass.wait_for_open_port(8123)
        hass.succeed("curl --fail http://localhost:8123/states")
        assert "API running" in hass.succeed(
            "curl --fail -H 'x-ha-access: ${apiPassword}' http://localhost:8123/api/"
        )
    with subtest("Toggle a binary sensor using MQTT"):
        assert '"state": "off"' in hass.succeed(
            "curl http://localhost:8123/api/states/binary_sensor.mqtt_binary_sensor -H 'x-ha-access: ${apiPassword}'"
        )
        hass.wait_until_succeeds(
            "mosquitto_pub -V mqttv311 -t home-assistant/test -u homeassistant -P '${mqttPassword}' -m let_there_be_light"
        )
        assert '"state": "on"' in hass.succeed(
            "curl http://localhost:8123/api/states/binary_sensor.mqtt_binary_sensor -H 'x-ha-access: ${apiPassword}'"
        )
    with subtest("Toggle a binary sensor using hass-cli"):
        assert '"state": "on"' in hass.succeed(
            "${hassCli} --output json state get binary_sensor.mqtt_binary_sensor"
        )
        hass.succeed(
            "${hassCli} state edit binary_sensor.mqtt_binary_sensor --json='{\"state\": \"off\"}'"
        )
        assert '"state": "off"' in hass.succeed(
            "curl http://localhost:8123/api/states/binary_sensor.mqtt_binary_sensor -H 'x-ha-access: ${apiPassword}'"
        )
    with subtest("Print log to ease debugging"):
        output_log = hass.succeed("cat ${configDir}/home-assistant.log")
        print("\n### home-assistant.log ###\n")
        print(output_log + "\n")

    with subtest("Check that no errors were logged"):
        assert "ERROR" not in output_log
  '';
})

@Mic92
Copy link
Member

Mic92 commented Jan 9, 2020

Part of #76088

@Mic92 Mic92 closed this Jan 9, 2020
@Br1ght0ne Br1ght0ne deleted the nixosTests.home-assistant-python branch January 9, 2020 11:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants