package org.jenkinsci.plugins.oic;

import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
import com.github.tomakehurst.wiremock.junit.WireMockRule;
import com.google.api.client.json.GenericJson;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;

import java.util.HashMap;

import static org.junit.Assert.*;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class FieldTest {

    @Rule
    public WireMockRule wireMockRule = new WireMockRule(new WireMockConfiguration().dynamicPort(),true);
    @Rule
    public JenkinsRule jenkinsRule = new JenkinsRule();

    @Test
    public void testNestedLookup() throws Exception {
        HashMap<String, Object> user = new HashMap<>();
        user.put("id", "100");

        GenericJson payload = new GenericJson();
        payload.put("email", "[email protected]");
        payload.put("user", user);
        payload.put("none", null);

        TestRealm realm = new TestRealm(wireMockRule);

        assertEquals("[email protected]", realm.getField(payload, "email"));
        assertEquals("100", realm.getField(payload, "user.id"));
        assertNull(realm.getField(payload, "unknown"));
        assertNull(realm.getField(payload, "user"));
        assertNull(realm.getField(payload, "user.invalid"));
        assertNull(realm.getField(payload, "none"));

        assertTrue(realm.containsField(payload, "email"));
        assertTrue(realm.containsField(payload, "user.id"));
        assertFalse(realm.containsField(payload, "unknown"));
        assertFalse(realm.containsField(payload, "user"));
        assertFalse(realm.containsField(payload, "user.invalid"));
        assertTrue(realm.containsField(payload, "none"));
    }

    @Test
    public void testNormalLookupDueToDot() throws Exception {
        HashMap<String, Object> user = new HashMap<>();
        user.put("id", "100");

        GenericJson payload = new GenericJson();
        payload.put("email", "[email protected]");
        payload.put("user", user);
        payload.put("none", null);
        payload.put("user.name", "myusername");

        TestRealm realm = new TestRealm(wireMockRule);

        assertEquals("[email protected]", realm.getField(payload, "email"));
        assertNull(realm.getField(payload, "unknown"));
        assertNull(realm.getField(payload, "user"));
        assertNull(realm.getField(payload, "user.invalid"));
        assertEquals("myusername", realm.getField(payload, "user.name"));
        assertNull(realm.getField(payload, "none"));

        assertTrue(realm.containsField(payload, "email"));
        assertFalse(realm.containsField(payload, "unknown"));
        assertFalse(realm.containsField(payload, "user"));
        assertFalse(realm.containsField(payload, "user.invalid"));
        assertTrue(realm.containsField(payload, "none"));
        assertTrue(realm.containsField(payload, "user.name"));
    }
}