/*
  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.
 */

#import "ObjectiveCMISTests+Environment.h"

NSString * const kCMISTestUsernameKey = @"ObjectiveCMISTestUsername";
NSString * const kCMISTestPasswordKey = @"ObjectiveCMISTestPassword";
NSString * const kCMISTestAtomPubUrlKey = @"ObjectiveCMISTestAtomPubUrl";
NSString * const kCMISTestRepoIdKey = @"ObjectiveCMISTestRepoId";

@implementation ObjectiveCMISTests (Environment)

- (NSString *)environmentStringForKey:(NSString *)envKey defaultValue:(NSString *)defaultValue
{
//    if (YES) return defaultValue;
    
    NSBundle *bundle = [NSBundle bundleForClass:[self class]];
    NSString *envValue = [bundle objectForInfoDictionaryKey:envKey];
    if ((nil == envValue) || ([envValue length] == 0)) {
        return defaultValue;
    }
    
    if ([defaultValue hasSuffix:@"/service/api/cmis"])  {
        //        envValue = @"http://127.0.0.1:8080/alfresco/cmisatom";
    }
    
    return envValue;
}


@end
