/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.netbeans.modules.websvc.rest.codegen;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.netbeans.modules.websvc.rest.codegen.model.ClientStubModel;
import org.netbeans.modules.websvc.rest.support.ZipUtil;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;

/**
 *
 * @author ayubskhan
 */
public class ClientStubsGeneratorTest extends TestBase {
    
    public ClientStubsGeneratorTest(String name) {
        super(name);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        setUpSrcDir();
        FileObject logDir = FileUtil.createFolder(new File(getWorkDir(), ".netbeans/var/log"));
    }
    
    public void testModelFromWadl() throws Exception {
//        String appName = "WebApplication1";
//        InputStream is = this.getClass().getResourceAsStream(appName.toLowerCase()+".xml");
//        ResourceModel m = new ClientStubModel().createModel(is);
//        m.build();
//        String url = ((WadlModeler)m).getBaseUrl();
//        assertEquals("http://localhost:8080/"+appName+"/resources/", url);
//        assertEquals(6, m.getResources().size());
    }

    private void testGenerateFromWadl(String appName) throws Exception {
        testGenerateFromWadl(appName, appName.toLowerCase());
    }
    
    private void testGenerateFromWadl(String appName, String fileName) throws Exception {
//        FileObject stubRoot = FileUtil.createFolder(getWorkDir());
//        String folder = "rest";
//        InputStream is = this.getClass().getResourceAsStream(fileName+".xml");
//        ClientStubsGenerator cs = new ClientStubsGenerator(stubRoot, folder, is, true);
//        cs.generate(null);
//
//        FileObject restFolder = stubRoot.getFileObject(folder);
//        File zipFile = new File(FileUtil.toFile(restFolder), fileName+"_1.zip");
//        if(zipFile.exists()) //clean
//            zipFile.delete();
//        FileObject appFolder = restFolder.getFileObject(appName.toLowerCase());
//        String[] sources = {
//            FileUtil.toFile(appFolder).getAbsolutePath()
//        };
//        String[] paths = {
//            ""
//        };
//        ZipUtil zipUtil = new ZipUtil();
//        zipUtil.zip(zipFile, sources, paths);
//
//        File base = new File(FileUtil.toFile(restFolder), fileName+".zip");
//        FileUtil.copy(this.getClass().getResourceAsStream(fileName+".zip"), new FileOutputStream(base));
//
//        assertEquals(base.length(), zipFile.length());
    }
    
    public void testGenerateFromWadlNonRecursiveResources() throws Exception {
        testGenerateFromWadl("WebApplication1");
    }
    
    public void testGenerateFromWadlRecursiveResources() throws Exception {
        testGenerateFromWadl("CustomerDB");
    }
    
    public void testGenerateFromWadlWithNonIdentifier() throws Exception {
        testGenerateFromWadl("foo_war");
    }
    
    public void testGenerateFromWadlRecursiveResources1() throws Exception {
        testGenerateFromWadl("_92_168_0_104_8080_smart_selection_rest_rest", "smart_selection_rest");
    }
    
    //Tests dont work due to exception from Retouche
//    public void testModelFromProject() throws Exception {
//        String appName = "WebApplication2";
//        InputStream is = this.getClass().getResourceAsStream(appName.toLowerCase()+".zip");
//        FileObject work = FileUtil.createFolder(getWorkDir());
//        ZipUtil zipUtil = new ZipUtil();
//        zipUtil.unzip(is, work, true);
//        Project p = FileOwnerQuery.getOwner(work.getFileObject(appName));
//        ResourceModel m = new ClientStubModel().createModel(p);
//        m.build();
//        assertEquals(6, m.getResources().size());
//    }
//    
//    public void testGenerateFromProject() throws Exception {
//        String appName = "WebApplication2";
//        InputStream is = this.getClass().getResourceAsStream(appName.toLowerCase()+".zip");
//        FileObject work = FileUtil.createFolder(getWorkDir());
//        ZipUtil zipUtil = new ZipUtil();
//        zipUtil.unzip(is, work, true);
//        Project p = FileOwnerQuery.getOwner(work.getFileObject(appName));
//        FileObject stubRoot = FileUtil.createFolder(getWorkDir());
//        String folder = "rest";
//        ClientStubsGenerator cs = new ClientStubsGenerator(stubRoot, folder, p, false, true);
//        cs.generate(null);
//        
//        FileObject restFolder = stubRoot.getFileObject(folder);
//        File zipFile = new File(FileUtil.toFile(restFolder), appName.toLowerCase()+"_1.zip");
//        if(zipFile.exists()) //clean
//            zipFile.delete();
//        FileObject appFolder = restFolder.getFileObject(appName.toLowerCase());
//        String[] sources = {
//            FileUtil.toFile(appFolder).getAbsolutePath()
//        };
//        String[] paths = {
//            ""
//        };
//        zipUtil.zip(zipFile, sources, paths);
//        
//        File base = new File(FileUtil.toFile(restFolder), appName.toLowerCase()+".zip");
//        FileUtil.copy(this.getClass().getResourceAsStream(appName.toLowerCase()+".zip"), new FileOutputStream(base));
//
//        assertEquals(base.length(), zipFile.length());
//    }
}
