use "../std/security/secret"

start:
    assert not option_is_some(secret_from_text(""))

    let created: Option[SecretText] = secret_from_text("api-key-value")
    assert option_is_some(created)
    let secret: SecretText = option_unwrap(created)
    let alias: SecretText = secret
    assert secret_is_valid(secret)
    assert secret_is_valid(alias)
    assert secret_redacted_text(secret) == "<redacted>"

    let revealed: Option[Text] = secret_reveal_text(secret)
    assert option_is_some(revealed)
    assert option_unwrap(revealed) == "api-key-value"

    assert secret_zeroize(secret)
    assert not secret_is_valid(alias)
    assert not option_is_some(secret_reveal_text(alias))
    assert not secret_zeroize(alias)

    let set_status: Number = env_set("YAZA_TEST_SECRET_TEXT", "environment-key")
    assert set_status == 0
    let environment_secret: Option[SecretText] = secret_from_environment("YAZA_TEST_SECRET_TEXT")
    assert option_is_some(environment_secret)
    let environment_value: SecretText = option_unwrap(environment_secret)
    assert option_unwrap(secret_reveal_text(environment_value)) == "environment-key"
    assert secret_zeroize(environment_value)

    let clear_status: Number = env_set("YAZA_TEST_SECRET_TEXT", "")
    assert clear_status == 0
    assert not option_is_some(secret_from_environment("YAZA_TEST_SECRET_TEXT"))
    assert not option_is_some(secret_from_environment("YAZA_MISSING_SECRET_TEXT"))

    var oversized_parts: TextList = text_list()
    var index: Number = 0
    while index < 65537:
        list_push(oversized_parts, "x")
        set index = index + 1
    let oversized_secret: Text = text_join(oversized_parts, "")
    assert not option_is_some(secret_from_text(oversized_secret))
