package quant.rich;

import java.util.function.Consumer;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import okhttp3.Request;
import quant.rich.emoney.patch.okhttp.RequestContext;
import quant.rich.emoney.patch.okhttp.PatchOkHttp;
import quant.rich.emoney.patch.okhttp.PatchOkHttpRule;

public class PatchOkHttpTest {

    @Test
    void test() {
        
        PatchOkHttpRule rule;
        RequestContext context;
        
        rule = PatchOkHttpRule.when().isHttps().build();
        
        
        context = new RequestContext(
                new Request.Builder()
                .url("https://localhost"));
        
        Assertions.assertTrue(rule.matches(context), "测试失败");
        
        rule = PatchOkHttpRule.when().hostEndsWith("emoney.cn")
                .or(c -> c.hostContains("localhost"))
                .or(a -> a.hostContains("emapp"))
                .or(b -> b.hasHeaderName("X-Protocol-Id"))
                .overrideHeader("User-Agent", "okhttp/3.12.2")
                .build();
        
        context = new RequestContext(new Request.Builder()
                .url("https://mbs.emoney.cn"));

        Assertions.assertTrue(rule.matches(context), "测试失败");

        context = new RequestContext(new Request.Builder()
                .url("https://emapp-static.oss-cn-shanghai.aliyuncs.com"));
        Assertions.assertTrue(rule.matches(context), "测试失败");
        
        // 测试 Override
        String[] modifier = new String[] {""};
        Consumer<String> consumer = str -> {
            modifier[0] = str;
        };
        
        PatchOkHttp.apply(rule);
        PatchOkHttp.match(context, "User-Agent", consumer);
        
        Assertions.assertTrue("okhttp/3.12.2".equals(modifier[0]), "测试失败：User-Agent 覆写失败");
       
        modifier[0] = "";
        context = new RequestContext(new Request.Builder()
                .url("https://hao123.com"));
        Assertions.assertFalse(rule.matches(context), "测试失败");
        
        PatchOkHttp.match(context, "User-Agent", consumer);
        Assertions.assertTrue("".equals(modifier[0]), "测试失败：User-Agent 不覆写失败");
        
        
        //Assertions.assertEquals("{\"info\":\"m\",\"weight\":\"100kg/m\"}", JSON.toJSONString(humanWeight));
    }
    
}
