require "vnd.dovecot.testsuite";
require "envelope";
require "vacation";
require "variables";

test_set "message" text:
From: stephan@example.org
To: tss@example.net
Subject: Frop!

Frop!
.
;

test_set "envelope.from" "sirius@example.org";
test_set "envelope.to" "timo@example.net";

test "Basic" {
	vacation :addresses "tss@example.net" :from "Timo Sirainen <sirainen@example.net>" "I am gone";

	if not test_result_execute {
		test_fail "failed to execute vacation";
	}

	test_message :smtp 0;

	if not address :is "to" "sirius@example.org" {
		test_fail "to address incorrect";
	}

	if not address :is "from" "sirainen@example.net" {
		test_fail "from address incorrect";
	}

	if not envelope :is "to" "sirius@example.org" {
		test_fail "envelope recipient incorrect";
	}

	if not envelope :is "from" "" {
		test_fail "envelope sender not null";
	}
}

test_result_reset;
test_set "envelope.from" "<>";

test "Null Sender" {
	vacation :addresses "tss@example.net" "I am gone";

	if not test_result_execute {
		test_fail "failed to execute vacation";
	}

	if test_message :smtp 0 {
		test_fail "reject sent message to NULL sender";
	}
}

test_result_reset;

test_set "message" text:
From: stephan@example.org
To: timo@example.net
Cc: stephan@friep.example.com
Subject: Frop!

Frop!
.
;

test_set "envelope.from" "sirius@example.org";
test_set "envelope.to" "timo@example.net";

test "Envelope.to == To" {
	vacation "I am gone";

	if not test_result_execute {
		test_fail "failed to execute vacation";
	}

	test_message :smtp 0;

	if not address :is "from" "timo@example.net" {
		test_fail "from address incorrect";
	}

	if not envelope :is "from" "" {
		test_fail "envelope sender not null";
	}
}

test_result_reset;

test_set "message" text:
From: stephan@example.org
To: tss@example.net
Cc: stephan@friep.example.com
Subject: Frop!

Frop!
.
;

test_set "envelope.from" "sirius@example.org";
test_set "envelope.to" "timo@example.net";

test "Envelope.to != To" {
	vacation :addresses "tss@example.net" "I am gone";

	if not test_result_execute {
		test_fail "failed to execute vacation";
	}

	test_message :smtp 0;

	if not address :is "from" "tss@example.net" {
		test_fail "from address incorrect";
	}

	if not envelope :is "from" "" {
		test_fail "envelope sender not null";
	}
}

test_result_reset;

test_set "message" text:
From: stephan@example.org
To: tss@example.net
Cc: colleague@example.net
Subject: Frop!

Frop!
.
;

test_set "envelope.from" "sirius@example.org";
test_set "envelope.to" "colleague@example.net";

test "Cc" {
	vacation "I am gone";

	if not test_result_execute {
		test_fail "failed to execute vacation";
	}

	test_message :smtp 0;

	if not address :is "from" "colleague@example.net" {
		if address :matches "from" "*" { }
		test_fail "from address incorrect: ${1}";
	}

	if not envelope :is "from" "" {
		test_fail "envelope sender not null";
	}
}

test_result_reset;

test_set "message" text:
From: stephan@example.org
Subject: No subject of discussion
To: nicëøôçêè—öxample.org

Frop
.
;

test "Bad recipient address (from message)" {
    vacation :subject "Tulips" "I am not in today!";

    if not test_result_execute {
        test_fail "execution of result failed";
    }

}

test_result_reset;

test_set "message" text:
From: stephan@example.org
Subject: No subject of discussion
To: tss@example.net

Frop
.
;

test_set "envelope.to" "nicëøôçêè—öxample.org";

test "Bad recipient address (from envelope)" {
    vacation :subject "Tulips" "I am not in today!";

    if not test_result_execute {
        test_fail "execution of result failed";
    }

}
