// ***************************************************************************************************************************
// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
// * to you 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                                                              *
// *                                                                                                                         *
// *  http://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 org.apache.juneau.rest;

import static org.apache.juneau.http.HttpMethodName.*;

import java.io.*;

import org.apache.juneau.http.annotation.Body;
import org.apache.juneau.http.annotation.Header;
import org.apache.juneau.http.annotation.Path;
import org.apache.juneau.http.annotation.Query;
import org.apache.juneau.json.*;
import org.apache.juneau.rest.annotation.*;
import org.apache.juneau.rest.mock2.*;
import org.junit.*;
import org.junit.runners.*;

/**
 * Validates that the correct status codes are returned on REST requests.
 */
@SuppressWarnings({})
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class StatusCodesTest {

	//=================================================================================================================
	// OK (200)
	//=================================================================================================================
	@Rest
	public static class A {
		@RestMethod(name=PUT)
		public Reader a01(@Body String b) {
			return new StringReader(b);
		}
	}
	private static MockRest a = MockRest.build(A.class, null);

	@Test
	public void a01a_OK() throws Exception {
		a.put("/a01", "foo").execute().assertStatus(200);
	}

	//=================================================================================================================
	// Bad Request (400)
	//=================================================================================================================

	@Rest(parsers=JsonParser.class)
	public static class B {
		@RestMethod(name=PUT, path="/nonExistentBeanProperties")
		public String b01(@Body B01 in) {
			return "OK";
		}
		public static class B01 {
			public String f1;
		}
		@RestMethod(name=PUT, path="/wrongDataType")
		public String b02(@Body B02 in) {
			return "OK";
		}
		public static class B02 {
			public int f1;
		}
		@RestMethod(name=PUT, path="/parseIntoNonConstructableBean")
		public String b03(@Body B03 in) {
			return "OK";
		}
		public static class B03 {
			public int f1;
			private B03(){}
		}
		@RestMethod(name=PUT, path="/parseIntoNonStaticInnerClass")
		public String b04(@Body B04 in) {
			return "OK";
		}
		public class B04 {
			public B04(){}
		}
		@RestMethod(name=PUT, path="/parseIntoNonPublicInnerClass")
		public String b05(@Body B05 in) {
			return "OK";
		}
		static class B05 {
			public B05(){}
		}
		@RestMethod(name=PUT, path="/thrownConstructorException")
		public String b06(@Body B06 in) {
			return "OK";
		}
		public static class B06 {
			public int f1;
			private B06(){}
			public static B06 valueOf(String s) {
				throw new RuntimeException("Test error");
			}
		}
		@RestMethod(name=PUT, path="/setParameterToInvalidTypes/{a1}")
		public String b07(@Query("p1") int t1, @Path("a1") int a1, @Header("h1") int h1) {
			return "OK";
		}
	}
	private static MockRest b = MockRest.build(B.class);

	@Test
	public void b01a_nonExistentBeanProperties() throws Exception {
		b.put("/nonExistentBeanProperties?noTrace=true", "{f2:'foo'}").json().execute()
			.assertStatus(400)
			.assertBodyContains(
				"Unknown property 'f2' encountered while trying to parse into class 'org.apache.juneau.rest.StatusCodesTest$B$B01'"
			);
	}
	@Test
	public void b01b_nonExistentBeanProperties() throws Exception {
		b.put("/nonExistentBeanProperties?noTrace=true", "{f1:'foo', f2:'foo'}").json().execute()
			.assertStatus(400)
			.assertBodyContains(
				"Unknown property 'f2' encountered while trying to parse into class 'org.apache.juneau.rest.StatusCodesTest$B$B01'"
			);
	}
	@Test
	public void b02_wrongDataType() throws Exception {
		b.put("/wrongDataType?noTrace=true", "{f1:'foo'}").json().execute()
			.assertStatus(400)
			.assertBodyContains(
				"Invalid number"
			);
	}
	@Test
	public void b03_parseIntoNonConstructableBean() throws Exception {
		b.put("/parseIntoNonConstructableBean?noTrace=true", "{f1:1}").json().execute()
			.assertStatus(400)
			.assertBodyContains(
				"could not be instantiated"
			);
	}
	@Test
	public void b04_parseIntoNonStaticInnerClass() throws Exception {
		b.put("/parseIntoNonStaticInnerClass?noTrace=true", "{f1:1}").json().execute()
			.assertStatus(400)
			.assertBodyContains(
				"could not be instantiated"
			);
	}
	@Test
	public void b05_parseIntoNonStaticInnerClass() throws Exception {
		b.put("/parseIntoNonPublicInnerClass?noTrace=true", "{f1:1}").json().execute()
			.assertStatus(400)
			.assertBodyContains(
				"Class is not public"
			);
	}
	@Test
	public void b06_thrownConstructorException() throws Exception {
		b.put("/thrownConstructorException?noTrace=true", "'foo'").json().execute()
			.assertStatus(400)
			.assertBodyContains(
				"Test error"
			);
	}
	@Test
	public void b07a_setParameterToInvalidTypes_Query() throws Exception {
		b.put("/setParameterToInvalidTypes/123?noTrace=true&p1=foo", "'foo'").json().execute()
			.assertStatus(400)
			.assertBodyContains(
				"Could not parse query parameter 'p1'."
			);
	}
	@Test
	public void b07a_setParameterToInvalidTypes_Path() throws Exception {
		b.put("/setParameterToInvalidTypes/foo?noTrace=true&p1=1", "'foo'").json().execute()
			.assertStatus(400)
			.assertBodyContains(
				"Could not parse path parameter 'a1'."
			);
	}
	@Test
	public void b07a_setParameterToInvalidTypes_Header() throws Exception {
		b.put("/setParameterToInvalidTypes/123?noTrace=true&p1=1", "'foo'").header("h1", "foo").json().execute()
			.assertStatus(400)
			.assertBodyContains(
				"Could not parse header 'h1'."
			);
	}

	//=================================================================================================================
	// Not Found (404) and Method Not Allowed (405)
	//=================================================================================================================

	@Rest
	public static class C {
		@RestMethod(name=GET, path="/")
		public String c01() {
			return "OK";
		}
	}
	private static MockRest c = MockRest.build(C.class);

	@Test
	public void c01_badPath() throws Exception {
		c.get("/bad?noTrace=true").execute()
			.assertStatus(404)
			.assertBodyContains(
				"Method 'GET' not found on resource with matching pattern on path '/bad'"
			);
	}
	public void c02_badMethod() throws Exception {
		c.put("?noTrace=true", null).execute()
			.assertStatus(405)
			.assertBodyContains(
				"Method 'PUT' not found on resource."
			);
	}

	//=================================================================================================================
	// Precondition Failed (412)
	//=================================================================================================================

	@Rest
	public static class D {
		@RestMethod(name=GET, matchers=NeverMatcher.class)
		public String d() {
			return "OK";
		}
		public static class NeverMatcher extends RestMatcher {
			@Override /* RestMatcher */
			public boolean matches(RestRequest req) {
				return false;
			}
		}
	}
	private static MockRest d = MockRest.build(D.class);

	@Test
	public void d01() throws Exception {
		d.get("/d?noTrace=true").execute()
			.assertStatus(412)
			.assertBodyContains(
				"Method 'GET' not found on resource on path '/d' with matching matcher."
			);
	}
}
