package net.joelinn.quartz.mixin;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import net.joelinn.quartz.jobstore.mixin.TriggerMixin;
import org.junit.Before;
import org.junit.Test;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.triggers.SimpleTriggerImpl;

import java.util.HashMap;
import java.util.Map;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.collection.IsMapContaining.hasKey;
import static org.junit.Assert.assertEquals;

/**
 * Joe Linn
 * 7/15/2014
 */
public class SimpleTriggerMixinTest {
    protected ObjectMapper mapper;

    @Before
    public void setUp(){
        mapper = new ObjectMapper();
        mapper.addMixIn(SimpleTrigger.class, TriggerMixin.class);
    }

    @Test
    public void serialization(){
        SimpleTrigger trigger = TriggerBuilder.newTrigger()
                .forJob("testJob", "testGroup")
                .withIdentity("testTrigger", "testTriggerGroup")
                .usingJobData("timeout", 5)
                .withDescription("A description!")
                .withSchedule(SimpleScheduleBuilder.repeatHourlyForever())
                .build();

        Map<String, String> triggerMap = mapper.convertValue(trigger, new TypeReference<HashMap<String, String>>() {});

        assertThat(triggerMap, hasKey("name"));
        assertEquals("testTrigger", triggerMap.get("name"));
        assertThat(triggerMap, hasKey("group"));
        assertEquals("testTriggerGroup", triggerMap.get("group"));
        assertThat(triggerMap, hasKey("jobName"));
        assertEquals("testJob", triggerMap.get("jobName"));

        SimpleTriggerImpl simpleTrigger = mapper.convertValue(triggerMap, SimpleTriggerImpl.class);

        assertEquals(trigger.getKey().getName(), simpleTrigger.getKey().getName());
        assertEquals(trigger.getKey().getGroup(), simpleTrigger.getKey().getGroup());
        assertEquals(trigger.getStartTime(), simpleTrigger.getStartTime());
        assertEquals(trigger.getRepeatInterval(), simpleTrigger.getRepeatInterval());
    }
}