/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.axis2.savan;

import junit.framework.TestCase;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.databinding.types.Duration;
import org.apache.axis2.databinding.utils.ConverterUtil;
import org.apache.savan.SavanMessageContext;
import org.apache.savan.eventing.EventingSubscriptionProcessor;
import org.apache.savan.subscription.ExpirationBean;
import org.apache.savan.util.CommonUtil;

import javax.xml.namespace.QName;
import java.io.File;
import java.io.IOException;
import java.util.Date;

public class EventingExpirationTypesTest extends TestCase {

    public void testDuration() throws Exception {
        SavanMessageContext renewMessage = getRenewMessage("eventing-renew-duration.xml");
        EventingSubscriptionProcessor processor = new EventingSubscriptionProcessor();
        ExpirationBean expirationBean = processor.getExpirationBean(renewMessage);
        assertTrue(expirationBean.isDuration());

        Duration duration = ConverterUtil.convertToDuration("P1Y2M3DT10H30M");
        assertEquals(duration, expirationBean.getDurationValue());
        assertEquals(expirationBean.getSubscriberID(), "UUID:DummySubscriberID");
    }

    public void testDateTime() throws Exception {
        SavanMessageContext renewMessage = getRenewMessage("eventing-renew-datetime.xml");
        EventingSubscriptionProcessor processor = new EventingSubscriptionProcessor();
        ExpirationBean expirationBean = processor.getExpirationBean(renewMessage);
        assertFalse(expirationBean.isDuration());

        Date date = ConverterUtil.convertToDateTime("2004-06-26T21:07:00.000-08:00").getTime();
        assertEquals(expirationBean.getDateValue(), date);
        assertEquals(expirationBean.getSubscriberID(), "UUID:DummySubscriberID");
    }

    private SavanMessageContext getRenewMessage(String name) throws IOException {
        File baseDir = new File("");
        String testRource = baseDir.getAbsolutePath() + File.separator + "src" + File.separator +
                            "test" + File.separator + "resources";

        SOAPEnvelope envelope = CommonUtil
                .getTestEnvelopeFromFile(testRource, name, OMAbstractFactory.getSOAP12Factory());

        MessageContext mc = new MessageContext();
        SavanMessageContext smc = new SavanMessageContext(mc);
        mc.setEnvelope(envelope);

        Options options = new Options();
        options.setTo(new EndpointReference("http://DummyToAddress/"));

        EndpointReference replyToEPR = new EndpointReference("http://DummyReplyToAddress/");
        replyToEPR.addReferenceParameter(new QName("RefParam1"), "RefParamVal1");
        options.setTo(replyToEPR);

        options.setAction("urn:uuid:DummyAction");

        return smc;
    }
}
