/*
  This test suite uses nixos common x11 and user-account test configurations.
  Those configurations use auto-login to ice-wm desktop manager.
  This test configuration enables yandex-music application, launches it and
  check for window existence. Additionally it takes screenshot after successful
  launch to allow to validate state manually. The result may miss the content
  inside window because of lack of GPU support.

  TODO(Shvedov): We should to perform automatic checks of screen state.
*/
{
  testers,
  path,

  # The yandex-music module
  nixosModule,
  # The extra configuration
  configuration ? { },
  # The extra code of test script
  extraTestScript ? "",
  # The name of test
  name ? "yandex-music-test",
}:
testers.runNixOSTest {
  inherit name;
  nodes.machine =
    let
      tests = "${path}/nixos/tests/common/";
      user = "alice";
    in
    {
      imports = [
        nixosModule
        "${tests}/x11.nix"
        "${tests}/user-account.nix"
        configuration
      ];
      test-support.displayManager.auto.user = user;
      programs.yandex-music.enable = true;
    };

  testScript =
    ''
      # We have to execute command with su beckause all commands performs under
      # the root user.
      def mk_command(command, tail = "", fork = False):
        if fork:
          tail = f"{tail} >&2 &"
        return f"su -c '{command}' - alice {tail}"

      machine.wait_for_x()
      machine.execute(mk_command("yandex-music", fork = True))

      check_command = mk_command('xwininfo -root -tree', tail = "| grep 'Яндекс Музыка'")

      machine.wait_until_succeeds(check_command, 120)
      machine.sleep(40)
      machine.succeed(check_command)
      machine.screenshot("screen")
    ''
    + extraTestScript;
}