/*
 * Copyright 2019-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.example;

import java.util.concurrent.TimeUnit;

import org.awaitility.Awaitility;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.output.ToStringConsumer;
import org.testcontainers.utility.MountableFile;

import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

import static org.assertj.core.api.Assertions.assertThat;

/**
 * @author Dave Syer
 *
 */
public class ContainerTests {

	@Test
	@Disabled
	void test() throws Exception {
		ToStringConsumer consumer = new ToStringConsumer();
		try (@SuppressWarnings("resource")
		GenericContainer<?> container = new GenericContainer<>("lambci/lambda:provided").withLogConsumer(consumer)
				.withCopyFileToContainer(MountableFile.forClasspathResource("testBootstrap"), "/var/task/bootstrap")
				.withEnv("DOCKER_LAMBDA_STAY_OPEN", "1").withExposedPorts(9001)) {
			container.start();
			int port = container.getFirstMappedPort();
			String host = container.getHost();
			LambdaApplication.main(new String[] { "--AWS_LAMBDA_RUNTIME_API=" + host + ":" + port,
					"--_HANDLER=uppercase", "--logging.level.org.springframework=DEBUG" });
			ResponseEntity<String> response = Awaitility.waitAtMost(5, TimeUnit.SECONDS).until(() -> {
				ResponseEntity<String> result = new RestTemplate().postForEntity(
						"http://" + host + ":" + port + "/2015-03-31/functions/foobar/invocations", "foo",
						String.class);
				return result;
			}, result -> result != null);
			assertThat(response.getBody()).isEqualTo("\"FOO\"");
			assertThat(response.getHeaders()).containsKey("X-Amzn-Requestid");
		}
		String output = consumer.toUtf8String();
		assertThat(output).contains("Lambda API listening on port 9001");
		assertThat(output).contains("START RequestId:");
		assertThat(output).contains("END RequestId:");
	}

}
