/*
 * Copyright (C) Alexandre Harvey-Tremblay - All Rights Reserved
 * Unauthorized copying of this file, via any medium is strictly prohibited
 * Proprietary and confidential
 * Written by Alexandre Harvey-Tremblay <ahtremblay@gmail.com>, 2014
 */

package com.salesfront.commons.server.implementation;

import com.salesfront.commons.server.implementations.XmlValidatorJ;
import com.salesfront.commons.server.implementations.XsdSchemaProviderJ;
import com.salesfront.commons.shared.Validator;
import com.salesfront.commons.shared.exception.request.parameter.SfIllegalParameterException;
import com.salesfront.commons.shared.exception.request.parameter.SfNullParameterException;
import com.salesfront.commons.shared.exception.request.parameter.SfXmlParsingException;
import com.salesfront.commons.shared.reference.Parameter;
import com.salesfront.gwtmoney.shared.Currency;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.assertTrue;

/**
 * Created by ahtremblay on 2015-10-17.
 */
public class TestValidator {

    @Test
    public void test_long(){
        Validator validator = new Validator(new XmlValidatorJ(new XsdSchemaProviderJ()));

        validator.checkParameter(Parameter.startNumber, "1");
        validator.checkParameter(Parameter.startNumber, "-1");
        validator.checkParameter(Parameter.startNumber, String.valueOf(Long.MAX_VALUE));
        validator.checkParameter(Parameter.startNumber, String.valueOf(Long.MIN_VALUE));

        boolean r1=false;
        try {
            validator.checkParameter(Parameter.startNumber, "a");
        } catch (SfIllegalParameterException e){
            r1=true;
        }
        assertTrue(r1);

        boolean r2=false;
        try {
            validator.checkParameter(Parameter.startNumber, String.valueOf(Long.MAX_VALUE) + 1);
        } catch (SfIllegalParameterException e){
            r2=true;
        }
        assertTrue(r2);

        boolean r3=false;
        try {
            validator.checkParameter(Parameter.startNumber, String.valueOf(Long.MIN_VALUE) + 1);
        } catch (SfIllegalParameterException e){
            r3=true;
        }
        assertTrue(r3);
    }

    @Test
    public void test1(){
        Validator validator = new Validator(new XmlValidatorJ(new XsdSchemaProviderJ()));

        for(Parameter parameter : Parameter.values()){
            List<String> valid = new ArrayList<>();
            List<String> invalid = new ArrayList<>();
            switch (parameter){
                case requestUri:
                    valid.add("domains/emails/sendEmail");
                    invalid.add("4%s");
                    break;
                case timestamp:
                    valid.add("1");
                    invalid.add("a");
                    break;
                case expires:
                    valid.add("5000");
                    invalid.add("a");
                    break;
                case messageSrn:
                    valid.add("srn:sf:mailbox:111111111111111111111111111111:domain:example.com:emailLocalPart:info:message:111111111111111111111111111111");
                    break;
                case mailboxSrn:
                    valid.add("srn:sf:mailbox:111111111111111111111111111111:domain:example.com:emailLocalPart:info");
                    break;
                case domainSrn:
                    valid.add("srn:sf:domain:111111111111111111111111111111:example.com");
                    invalid.add("srn:sf:domain:111111111111111111111111111111:EXAMPLE.COM");
                    break;
                case requestSrn:
                    valid.add("srn:sf:request:111111111111111111111111111111");
                    break;
                case userSrn:
                    valid.add("srn:sf:iam:111111111111111111111111111111:users:111111111111111111111111111111");
                    break;
                case rootSrn:
                    valid.add("srn:sf:iam:111111111111111111111111111111:root");
                    break;
                case groupSrn:
                    valid.add("srn:sf:iam:111111111111111111111111111111:groups:111111111111111111111111111111");
                    break;
                case tokenSrn:
                    valid.add("srn:sf:iam:111111111111111111111111111111:users:111111111111111111111111111111:tokens:111111111111111111111111111111");
                    break;
                case credentialSrn:
                    valid.add("srn:sf:iam:111111111111111111111111111111:credentials:info@example.com");
                    break;
                case sessionRootSrn:
                    valid.add("srn:sf:iam:session:111111111111111111111111111111:root:111111111111111111111111111111");
                    break;
                case sessionUserSrn:
                    valid.add("srn:sf:iam:session:111111111111111111111111111111:users:111111111111111111111111111111:111111111111111111111111111111");
                    break;
                case policyXml:
                    valid.add("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
                            "<policy \n" +
                            "        xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
                            "        xsi:schemaLocation=\"https://www.salesfront.com/schema 20150831/policy.xsd\">\n" +
                            "\n" +
                            "   <statement>\n" +
                            "       <effect>Allow</effect>\n" +
                            "       <action>iam:*</action>\n" +
                            "       <resource>srn:sf:system:credential:ahtremblay@gmail.com</resource>\n" +
                            "   </statement>\n" +
                            "\n" +
                            "</policy>\n");
                    break;
                case recaptchaResponse:
                    valid.add("123");
                    invalid.add(null);
                    break;
                case password:
                    valid.add("8124208");
                    invalid.add(")~lQTX1ZmnO;jeIBt)\"6lb;-d[m2,Y&cA.l8m1<%<@q,[:Rh-PlMg0&92%P;+bP.^:~gFRiRxkwAG~R2M>eba\"J6u%!B(mm0?c(Lt}CqXw1%1|P`p!?;*{g)\"0rAIpuVojei");
                    break;
                case oldPassword:
                    valid.add("124");
                    invalid.add(")~lQTX1ZmnO;jeIBt)\"6lb;-d[m2,Y&cA.l8m1<%<@q,[:Rh-PlMg0&92%P;+bP.^:~gFRiRxkwAG~R2M>eba\"J6u%!B(mm0?c(Lt}CqXw1%1|P`p!?;*{g)\"0rAIpuVojei");
                    break;
                case newPassword:
                    valid.add("124");
                    invalid.add(")~lQTX1ZmnO;jeIBt)\"6lb;-d[m2,Y&cA.l8m1<%<@q,[:Rh-PlMg0&92%P;+bP.^:~gFRiRxkwAG~R2M>eba\"J6u%!B(mm0?c(Lt}CqXw1%1|P`p!?;*{g)\"0rAIpuVojei");
                    break;
                case signature:
                    valid.add("2io3jr");
                    invalid.add(")~lQTX1ZmnO;jeIBt)\"6lb;-d[m2,Y&cA.l8m1<%<@q,[:Rh-PlMg0&92%P;+bP.^:~gFRiRxkwAG~R2M>eba\"J6u%!B(mm0?c(Lt}CqXw1%1|P`p!?;*{g)\"0rAIpuVojei\")~lQTX1ZmnO;jeIBt)\"6lb;-d[m2,Y&cA.l8m1<%<@q,[:Rh-PlMg0&92%P;+bP.^:~gFRiRxkwAG~R2M>eba\"J6u%!B(mm0?c(Lt}CqXw1%1|P`p!?;*{g)\"0rAIpuVojei");
                    break;
                case emailLocalPart:
                    valid.add("info");
                    invalid.add("!)@($@!$* hh++ ");
                    break;
                case domain:
                    valid.add("salesfront.com");
                    invalid.add(" ef + ");
                    break;
                case source:
                    valid.add("system:users:sendEmailForNewUser");
                    invalid.add("%");
                    break;
                case exclusiveStartKey:
                    valid.add("124");
                    invalid.add(")~lQTX1ZmnO;jeIBt)\"6lb;-d[m2,Y&cA.l8m1<%<@q,[:Rh-PlMg0&92%P;+bP.^:~gFRiRxkwAG~R2M>eba\"J6u%!B(mm0?c(Lt}CqXw1%1|P`p!?;*{g)\"0rAIpuVojei\")~lQTX1ZmnO;jeIBt)\"6lb;-d[m2,Y&cA.l8m1<%<@q,[:Rh-PlMg0&92%P;+bP.^:~gFRiRxkwAG~R2M>eba\"J6u%!B(mm0?c(Lt}CqXw1%1|P`p!?;*{g)\"0rAIpuVojei");
                    break;
                case keyId:
                    valid.add("124");
                    invalid.add(")~lQTX1ZmnO;jeIBt)\"6lb;-d[m2,Y&cA.l8m1<%<@q,[:Rh-PlMg0&92%P;+bP.^:~gFRiRxkwAG~R2M>eba\"J6u%!B(mm0?c(Lt}CqXw1%1|P`p!?;*{g)\"0rAIpuVojei\")~lQTX1ZmnO;jeIBt)\"6lb;-d[m2,Y&cA.l8m1<%<@q,[:Rh-PlMg0&92%P;+bP.^:~gFRiRxkwAG~R2M>eba\"J6u%!B(mm0?c(Lt}CqXw1%1|P`p!?;*{g)\"0rAIpuVojei");
                    break;
                case email:
                    valid.add("info@example.com");
                    break;
                case secondaryEmail:
                    valid.add("info@example.com");
                    break;
                case filename:
                    valid.add("1");
                    invalid.add(")~lQTX1ZmnO;jeIBt)\"6lb;-d[m2,Y&cA.l8m1<%<@q,[:Rh-PlMg0&92%P;+bP.^:~gFRiRxkwAG~R2M>eba\"J6u%!B(mm0?c(Lt}CqXw1%1|P`p!?;*{g)\"0rAIpuVojei\")~lQTX1ZmnO;jeIBt)\"6lb;-d[m2,Y&cA.l8m1<%<@q,[:Rh-PlMg0&92%P;+bP.^:~gFRiRxkwAG~R2M>eba\"J6u%!B(mm0?c(Lt}CqXw1%1|P`p!?;*{g)\"0rAIpuVojei");
                    break;
                case fileSrn:
                    valid.add("srn:sf:file:temporary:111111111111111111111111111111:root:111111111111111111111111111111");
                    break;
                case organizationSrn:
                    valid.add("srn:sf:organization:111111111111111111111111111111:111111111111111111111111111111");
                    break;
                case accountSrn:
                    valid.add("srn:sf:account:111111111111111111111111111111:111111111111111111111111111111");
                    break;
                case accountingEntrySrn:
                    valid.add("srn:sf:account:111111111111111111111111111111:111111111111111111111111111111:accountingEntry:111111111111111111111111111111");
                    break;
                case startNumber:
                    valid.add("1");
                    invalid.add("X");
                    break;
                case endNumber:
                    valid.add("1");
                    invalid.add("X");
                    break;
                case mailboxFolderName:
                    valid.add("INBOX");
                    valid.add("Sent");
                    valid.add("Sent/Today");
                    invalid.add("INBOX//test");
                    invalid.add("Sent Messages");
                    invalid.add("/inbox");
                    invalid.add("/");
                    invalid.add("//");
                    invalid.add("inbox/");
                    invalid.add("inbox/inboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinboxinbox");
                    break;
                case operation:
                    valid.add("ADD");
                    invalid.add("");
                    break;
                case imapToken:
                    valid.add("1");
                    invalid.add("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
                    break;
                case rangeModSeq:
                    valid.add("1");
                    invalid.add("x");
                    break;
                case number:
                    valid.add("1");
                    invalid.add("x");
                    break;
                case emailPartId:
                    valid.add("TEXT");
                    valid.add("HTML");
                    valid.add("PLAIN");
                    valid.add("1.1");
                    valid.add("1");
                    valid.add("11");
                    valid.add("1.2.3");
                    valid.add("1.");
                    invalid.add(".1");
                    invalid.add("TEXT!");
                    invalid.add("1..1");
                    invalid.add("1...1");
                    invalid.add("0");
                    invalid.add("1.a");
                    invalid.add("|");
                    invalid.add("1|");
                    invalid.add("14|13|13");
                    break;
                case creditCardPan:
                    valid.add("4556563023432427");
                    valid.add("4916331780449330");
                    valid.add("4539766246722845");
                    valid.add("4532615392139535");
                    valid.add("4916121391334512");
                    valid.add("5233636194581095");
                    valid.add("5135502118270323");
                    valid.add("5164381026817432");
                    valid.add("5114283117984801");
                    valid.add("5453064211260432");
                    valid.add("6011565197318120");
                    valid.add("6011342696088798");
                    valid.add("6011998087303409");
                    valid.add("6011212825741882");
                    valid.add("6011038499099574");
                    valid.add("378630237945637");
                    valid.add("370685042332387");
                    valid.add("344008575155427");
                    valid.add("340509096211452");
                    valid.add("375521833758404");

                    invalid.add("4556563023432421");
                    invalid.add("4916331780449331");
                    invalid.add("4539766246722841");
                    invalid.add("4532615392139531");
                    invalid.add("4916121391334511");
                    invalid.add("5233636194581015");
                    invalid.add("5135502118270321");
                    invalid.add("5164381026817431");
                    invalid.add("5114283117984802");
                    invalid.add("5453064211260431");
                    invalid.add("6011565197318122");
                    invalid.add("6011342696088791");
                    invalid.add("6011998087303401");
                    invalid.add("6011212825741881");
                    invalid.add("6011038499099571");
                    invalid.add("378630237945631");
                    invalid.add("370685042332381");
                    invalid.add("344008575155421");
                    invalid.add("340509096211451");
                    invalid.add("375521833758401");
                    break;
                case creditCardExpMMYYYY:
                    valid.add("102023");
                    invalid.add("102023a");
                    invalid.add("02023a");
                    break;
                case decimal:
                    valid.add("1");
                    valid.add("1.");
                    valid.add("1.1");
                    valid.add("0.1");
                    invalid.add(".1");
                    invalid.add("1.1.");
                    invalid.add("");
                    break;
                case currency:
                    for(Currency currency : Currency.values())
                        valid.add(currency.name());
                    break;
                case phone:
                    valid.add("1");
                    valid.add("124124");
                    valid.add("124124;124");
                    invalid.add("124124;");
                    invalid.add(";");
                    invalid.add(";235235");
                    break;
            }

            System.out.print(parameter.name());
            for(String v : valid)
                validator.checkParameter(parameter, v);

            boolean rn=false;
            try {validator.checkParameter(parameter, null);} catch (SfNullParameterException e){rn=true;}
            assertTrue(rn);

            for(String i : invalid) {
                boolean ri = false;
                try {
                    validator.checkParameter(parameter, i);
                } catch (SfIllegalParameterException | SfXmlParsingException | SfNullParameterException e) {
                    ri = true;
                }
                if (!ri)
                    System.out.println("... " + i);
                assertTrue(ri);
            }

            System.out.println("... is valid");
        }
    }
}
