content: package ro.isdc.wro.http.support;
  
  import static org.junit.Assert.assertEquals;
  import static org.junit.Assert.assertTrue;
  
  import java.util.Map;
  
  import javax.servlet.FilterChain;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  
  import org.junit.AfterClass;
  import org.junit.Before;
  import org.junit.BeforeClass;
  import org.junit.Test;
  import org.mockito.Mock;
  import org.mockito.MockitoAnnotations;
  
  import ro.isdc.wro.WroRuntimeException;
  import ro.isdc.wro.config.Context;
  import ro.isdc.wro.config.jmx.WroConfiguration;
  
  
  /**
   * Test the behavior of {@link ResponseHeadersConfigurer}
   * 
   * @author Alex Objelean
   */
  public class TestResponseHeadersConfigurer {
    @Mock
    private HttpServletRequest request;
    @Mock
    private HttpServletResponse response;
    @Mock
    private FilterChain chain;
    private ResponseHeadersConfigurer victim;
    
    @BeforeClass
    public static void onBeforeClass() {
      assertEquals(0, Context.countActive());
    }
    
    @AfterClass
    public static void onAfterClass() {
      assertEquals(0, Context.countActive());
    }
    
    @Before
    public void setUp()
        throws Exception {
      MockitoAnnotations.initMocks(this);
      victim = new ResponseHeadersConfigurer();
    }
    
    @Test
    public void shouldHaveNoConfiguredHeadersWhenDefaultHeadersAreNotSet() {
      victim = ResponseHeadersConfigurer.emptyHeaders();
      assertTrue(victim.getHeadersMap().entrySet().isEmpty());
    }
    
    @Test
    public void shouldUseConfiguredDefaultHeaders() {
      final String etag = "123";
      victim = new ResponseHeadersConfigurer() {
        @Override
        public void configureDefaultHeaders(final Map<String, String> map) {
          map.put(HttpHeader.ETAG.name(), etag);
        }
      };
      final Map<String, String> map = victim.getHeadersMap();
      assertEquals(1, map.size());
      assertEquals(etag, map.get(HttpHeader.ETAG.getHeaderName()));
    }
    
    @Test
    public void shouldHaveNoCacheHeadersInDebugMode() {
      final WroConfiguration config = new WroConfiguration();
      config.setDebug(true);
      victim = ResponseHeadersConfigurer.fromConfig(config);
      
      final Map<String, String> map = victim.getHeadersMap();
      assertEquals(3, map.size());
      assertEquals("no-cache", map.get(HttpHeader.PRAGMA.getHeaderName()));
      assertEquals("no-cache", map.get(HttpHeader.CACHE_CONTROL.getHeaderName()));
      assertEquals("0", map.get(HttpHeader.EXPIRES.getHeaderName()));
    }
    
    @Test
    public void shouldSetCacheControlForOneYearWhenDebugModeIsFalse() {
      final WroConfiguration config = new WroConfiguration();
      config.setDebug(false);
      victim = ResponseHeadersConfigurer.fromConfig(config);
      
      final Map<String, String> map = victim.getHeadersMap();
      assertEquals(3, map.size());
      assertEquals("public, max-age=315360000", map.get(HttpHeader.CACHE_CONTROL.getHeaderName()));
    }
    
    @Test
    public void shouldUseHeadersSetAsString() {
      victim = ResponseHeadersConfigurer.withHeadersSet("h1:v1 | h2:v2");
      
      final Map<String, String> map = victim.getHeadersMap();
      assertEquals("v1", map.get("h1"));
      assertEquals("v2", map.get("h2"));
      assertEquals(2, map.size());
    }
    
    @Test(expected = WroRuntimeException.class)
    public void cannotUseHeadersSetWronglyAsString() {
      final WroConfiguration config = new WroConfiguration();
      config.setDebug(true);
      config.setHeader("h1=v1 , h2 =v2");
      victim = ResponseHeadersConfigurer.fromConfig(config);
      
      final Map<String, String> map = victim.getHeadersMap();
      assertEquals(2, map.size());
      assertEquals("v1", map.get("h1"));
      assertEquals("v2", map.get("h2"));
    }
  }
  