require "vnd.dovecot.testsuite";

require "relational";
require "comparator-i;ascii-numeric";
require "fileinto";

test "Action conflicts: reject <-> fileinto" {
	if not test_script_compile "errors/conflict-reject-fileinto.sieve" {
		test_fail "compile failed";
	}

	if test_script_run {
		test_fail "execution should have failed";
	}

	if test_error :count "gt" :comparator "i;ascii-numeric" "1" {
		test_fail "too many runtime errors reported";
	}
}

test "Action conflicts: reject <-> keep" {
	if not test_script_compile "errors/conflict-reject-keep.sieve" {
		test_fail "compile failed";
	}

	if test_script_run {
		test_fail "execution should have failed";
	}

	if test_error :count "gt" :comparator "i;ascii-numeric" "1" {
		test_fail "too many runtime errors reported";
	}
}

test "Action conflicts: reject <-> redirect" {
	if not test_script_compile "errors/conflict-reject-redirect.sieve" {
		test_fail "compile failed";
	}

	if test_script_run {
		test_fail "execution should have failed";
	}

	if test_error :count "gt" :comparator "i;ascii-numeric" "1" {
		test_fail "too many runtime errors reported";
	}
}

test "Action limit" {
	if not test_script_compile "errors/actions-limit.sieve" {
		test_fail "compile failed";
	}

	if test_script_run {
		test_fail "execution should have failed";
	}

	if test_error :count "gt" :comparator "i;ascii-numeric" "1" {
		test_fail "too many runtime errors reported";
	}

	if not test_error :index 1 :contains "total number of actions exceeds policy limit"{
		test_fail "unexpected error reported";
	}
}

test "Redirect limit" {
	if not test_script_compile "errors/redirect-limit.sieve" {
		test_fail "compile failed";
	}

	if test_script_run {
		test_fail "execution should have failed";
	}

	if test_error :count "gt" :comparator "i;ascii-numeric" "1" {
		test_fail "too many runtime errors reported";
	}

	if not test_error :index 1 :contains "number of redirect actions exceeds policy limit"{
		test_fail "unexpected error reported";
	}
}

test "Fileinto missing folder" {
	if not test_script_compile "errors/fileinto.sieve" {
		test_fail "compile failed";
	}

	test_mailbox_create "INBOX";

	if not test_script_run {
		test_fail "execution failed";
	}

	if test_result_execute {
		test_fail "execution of result should have failed";
	}

	if test_error :count "gt" :comparator "i;ascii-numeric" "1" {
		test_fail "too many runtime errors reported";
	}

	if not allof (
		test_error :index 1 :contains "failed to store into mailbox",
		test_error :index 1 :contains "exist",
		test_error :index 1 :contains "FROP") {
		test_fail "unexpected error reported";
	}
}

test "Fileinto invalid folder name" {
	if not test_script_compile "errors/fileinto-invalid-name.sieve" {
		test_fail "compile failed";
	}

	if not test_script_run {
		test_fail "execution failed";
	}

	if test_result_execute {
		test_fail "execution of result should have failed";
	}

	if not test_error :count "eq" :comparator "i;ascii-numeric" "1" {
		test_fail "wrong number of runtime errors reported";
	}

	if not allof (
		test_error :index 1 :contains "failed to store into mailbox",
		test_error :index 1 :contains "name") {
		test_fail "unexpected error reported";
	}
}

test "Fileinto bad UTF-8 in folder name" {
	if not test_script_compile "errors/fileinto-bad-utf8.sieve" {
		test_fail "compile failed";
	}

	if test_script_run {
		test_fail "execution should have failed";
	}

	if not test_error :count "eq" :comparator "i;ascii-numeric" "1" {
		test_fail "wrong number of runtime errors reported";
	}

	if not test_error :index 1 :contains "invalid folder name" {
		test_fail "unexpected error reported";
	}
}
