106 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
import ./make-test-python.nix ({ pkgs, lib, ... }:
 | 
						|
 | 
						|
let
 | 
						|
  configDir = "/var/lib/foobar";
 | 
						|
  mqttUsername = "homeassistant";
 | 
						|
  mqttPassword = "secret";
 | 
						|
in {
 | 
						|
  name = "home-assistant";
 | 
						|
  meta.maintainers = lib.teams.home-assistant.members;
 | 
						|
 | 
						|
  nodes.hass = { pkgs, ... }: {
 | 
						|
    environment.systemPackages = with pkgs; [ mosquitto ];
 | 
						|
    services.mosquitto = {
 | 
						|
      enable = true;
 | 
						|
      checkPasswords = true;
 | 
						|
      users = {
 | 
						|
        "${mqttUsername}" = {
 | 
						|
          acl = [ "topic readwrite #" ];
 | 
						|
          password = mqttPassword;
 | 
						|
        };
 | 
						|
      };
 | 
						|
    };
 | 
						|
    services.home-assistant = {
 | 
						|
      inherit configDir;
 | 
						|
      enable = true;
 | 
						|
      # includes the package with all tests enabled
 | 
						|
      package = pkgs.home-assistant;
 | 
						|
      config = {
 | 
						|
        homeassistant = {
 | 
						|
          name = "Home";
 | 
						|
          time_zone = "UTC";
 | 
						|
          latitude = "0.0";
 | 
						|
          longitude = "0.0";
 | 
						|
          elevation = 0;
 | 
						|
        };
 | 
						|
        frontend = {};
 | 
						|
        mqtt = {
 | 
						|
          broker = "127.0.0.1";
 | 
						|
          username = mqttUsername;
 | 
						|
          password = mqttPassword;
 | 
						|
        };
 | 
						|
        binary_sensor = [{
 | 
						|
          platform = "mqtt";
 | 
						|
          state_topic = "home-assistant/test";
 | 
						|
          payload_on = "let_there_be_light";
 | 
						|
          payload_off = "off";
 | 
						|
        }];
 | 
						|
        emulated_hue = {
 | 
						|
          host_ip = "127.0.0.1";
 | 
						|
          listen_port = 80;
 | 
						|
        };
 | 
						|
        logger = {
 | 
						|
          default = "info";
 | 
						|
          logs."homeassistant.components.mqtt" = "debug";
 | 
						|
        };
 | 
						|
      };
 | 
						|
      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/lovelace")
 | 
						|
    with subtest("Toggle a binary sensor using MQTT"):
 | 
						|
        hass.wait_for_open_port(1883)
 | 
						|
        hass.succeed(
 | 
						|
            "mosquitto_pub -V mqttv5 -t home-assistant/test -u ${mqttUsername} -P '${mqttPassword}' -m let_there_be_light"
 | 
						|
        )
 | 
						|
    with subtest("Check that capabilities are passed for emulated_hue to bind to port 80"):
 | 
						|
        hass.wait_for_open_port(80)
 | 
						|
        hass.succeed("curl --fail http://localhost:80/description.xml")
 | 
						|
    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
 | 
						|
 | 
						|
    # example line: 2020-06-20 10:01:32 DEBUG (MainThread) [homeassistant.components.mqtt] Received message on home-assistant/test: b'let_there_be_light'
 | 
						|
    with subtest("Check we received the mosquitto message"):
 | 
						|
        assert "let_there_be_light" in output_log
 | 
						|
 | 
						|
    with subtest("Check systemd unit hardening"):
 | 
						|
        hass.log(hass.succeed("systemd-analyze security home-assistant.service"))
 | 
						|
  '';
 | 
						|
})
 |