/**
 * Copyright (C) 2013-2015 all@code-story.net
 *
 * 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
 *
 *         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 net.codestory.http.extensions;

import net.codestory.http.Request;
import net.codestory.http.Response;
import net.codestory.http.compilers.CompilerFacade;
import net.codestory.http.io.Resources;
import net.codestory.http.misc.Env;
import net.codestory.http.payload.PayloadWriter;
import net.codestory.http.templating.Site;
import net.codestory.http.testhelpers.AbstractProdWebServerTest;
import org.junit.Test;

import java.io.IOException;

public class CustomPayloadWriterTest extends AbstractProdWebServerTest {
  @Test
  public void add_resolver() {
    configure(routes -> routes
      .get("/", new CustomPayload())
      .setExtensions(new Extensions() {
        @Override
        public PayloadWriter createPayloadWriter(Request request, Response response, Env env, Site site, Resources resources, CompilerFacade compilers) {
          return new CustomPayloadWriter(request, response, env, site, resources, compilers);
        }
      }));

    get("/").should().haveType("text/html;charset=UTF-8").contain("Hello World");
  }

  static class CustomPayloadWriter extends PayloadWriter {
    public CustomPayloadWriter(Request request, Response response, Env env, Site site, Resources resources, CompilerFacade compilers) {
      super(request, response, env, site, resources, compilers);
    }

    @Override
    protected String getContentType(Object payload, String uri) {
      if (payload instanceof CustomPayload) {
        return "text/html;charset=UTF-8";
      }
      return super.getContentType(payload, uri);
    }

    @Override
    protected byte[] getData(Object payload, String uri) throws IOException {
      if (payload instanceof CustomPayload) {
        return forString(((CustomPayload) payload).content());
      }
      return super.getData(payload, uri);
    }
  }

  static class CustomPayload {
    public String content() {
      return "Hello World";
    }
  }
}
