@Test
  public void shouldSetHeaderOnResponse() {
    AddHeaderBean header = new AddHeaderBean();
    header.setHeaderName("X-Clacks-Overhead");
    header.setHeaderValue("GNU Terry Pratchett");
    header.setOverwrite(false);
    header.setApplyTo(ApplyTo.RESPONSE);
    header.setValueType(ValueType.STRING);
    config.getAddHeaders().add(header);

    policy.apply(response, mContext, config, mResponseChain);

    assertEquals("GNU Terry Pratchett", response.getHeaders().get("X-Clacks-Overhead"));
    assertEquals(1, response.getHeaders().size());
  }
  @Test
  public void shouldStripHeaderWithKey() {
    request.getHeaders().put("vanish", "begone");

    StripHeaderBean shb = new StripHeaderBean();
    shb.setPattern("vanish");
    shb.setStripType(StripType.KEY);
    shb.setWith(With.STRING);

    config.getStripHeaders().add(shb);

    policy.apply(request, mContext, config, mRequestChain);

    assertFalse(request.getHeaders().containsKey("vanish"));
  }
  @Test
  public void shouldStripCaseInsensitively() {
    request.getHeaders().put("lord", "Vetinari");

    StripHeaderBean shb = new StripHeaderBean();
    shb.setPattern("VETINAR\\w+");
    shb.setStripType(StripType.VALUE);
    shb.setWith(With.REGEX);

    config.getStripHeaders().add(shb);

    policy.apply(request, mContext, config, mRequestChain);

    assertFalse(request.getHeaders().containsKey("vetinari"));
    assertTrue(request.getHeaders().isEmpty());
  }
  @Test
  public void shouldStripHeaderWithRegexKey() {
    request.getHeaders().put("sybil", "ramkin");

    StripHeaderBean shb = new StripHeaderBean();
    shb.setPattern("sy.*l");
    shb.setStripType(StripType.KEY);
    shb.setWith(With.REGEX);

    config.getStripHeaders().add(shb);

    policy.apply(request, mContext, config, mRequestChain);

    assertFalse(request.getHeaders().containsKey("sybil"));
    assertTrue(request.getHeaders().isEmpty());
  }
  @Test
  public void shouldNotOverwriteWhenFlagUnset() {
    request.getHeaders().put("X-Clacks-Overhead", "Ridcully");

    AddHeaderBean header = new AddHeaderBean();
    header.setHeaderName("X-Clacks-Overhead");
    header.setHeaderValue("GNU Terry Pratchett");
    header.setOverwrite(false);
    header.setApplyTo(ApplyTo.REQUEST);
    header.setValueType(ValueType.STRING);
    config.getAddHeaders().add(header);

    policy.apply(request, mContext, config, mRequestChain);

    assertEquals("Ridcully", request.getHeaders().get("X-Clacks-Overhead"));
    assertEquals(1, request.getHeaders().size());
  }
  @Test
  public void shouldStripHeaderWithValue() {
    request.getHeaders().put("lu", "tze");
    request.getHeaders().put("lu", "tze");

    StripHeaderBean shb = new StripHeaderBean();
    shb.setPattern("tze");
    shb.setStripType(StripType.VALUE);
    shb.setWith(With.STRING);

    config.getStripHeaders().add(shb);

    policy.apply(request, mContext, config, mRequestChain);
    policy.apply(response, mContext, config, mResponseChain);

    assertFalse(request.getHeaders().containsKey("lu"));
    assertFalse(response.getHeaders().containsKey("lu"));
  }
  @Test
  public void shouldGetValueFromSystemProperties() {
    System.setProperty("PROPERTIES_KEY", "42");

    AddHeaderBean header = spy(new AddHeaderBean());

    header.setHeaderName("the-meaning-of-life");
    header.setHeaderValue("PROPERTIES_KEY");
    header.setOverwrite(false);
    header.setApplyTo(ApplyTo.REQUEST);
    header.setValueType(ValueType.SYS);
    config.getAddHeaders().add(header);

    policy.apply(request, mContext, config, mRequestChain);

    assertEquals("42", request.getHeaders().get("the-meaning-of-life"));
    assertEquals(1, request.getHeaders().size());
  }
  @Test
  public void shouldGetValueFromEnvironment() {
    AddHeaderBean header = spy(new AddHeaderBean());

    header.setHeaderName("the-meaning-of-life");
    header.setHeaderValue("KEY_TO_THE_ENVIRONMENT");
    header.setOverwrite(false);
    header.setApplyTo(ApplyTo.REQUEST);
    header.setValueType(ValueType.ENV);
    config.getAddHeaders().add(header);

    given(header.getResolvedHeaderValue()).willReturn("42");

    policy.apply(request, mContext, config, mRequestChain);

    assertEquals("42", request.getHeaders().get("the-meaning-of-life"));
    assertEquals(1, request.getHeaders().size());
  }
  @Test
  public void shouldSetHeaderOnBoth() {
    AddHeaderBean header = new AddHeaderBean();
    header.setHeaderName("Request-And-Response");
    header.setHeaderValue("Weatherwax");
    header.setOverwrite(false);
    header.setApplyTo(ApplyTo.BOTH);
    header.setValueType(ValueType.STRING);
    config.getAddHeaders().add(header);

    policy.apply(request, mContext, config, mRequestChain);

    assertEquals("Weatherwax", request.getHeaders().get("Request-And-Response"));
    assertEquals(1, request.getHeaders().size());

    policy.apply(response, mContext, config, mResponseChain);

    assertEquals("Weatherwax", response.getHeaders().get("Request-And-Response"));
    assertEquals(1, response.getHeaders().size());
  }