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

var App = require('app');
require('models/root_service');

var roleMock = function (str, flag) {
  return flag ? str.toLowerCase() : str.toCapital();
};

describe('App.RootService', function () {

  var rootService;

  beforeEach(function () {
    rootService = App.RootService.createRecord();
  });

  describe('#displayName', function () {

    beforeEach(function () {
      sinon.stub(App.format, 'role', roleMock);
    });

    afterEach(function () {
      App.format.role.restore();
    });

    it('should format service name', function () {
      rootService.set('serviceName', 'HDFS');
      expect(rootService.get('displayName')).to.equal('hdfs');
    });

  });

});

describe('App.RootServiceComponents', function () {

  var rootServiceComponents;

  beforeEach(function () {
    rootServiceComponents = App.RootServiceComponents.createRecord();
  });

  describe('#displayName', function () {

    beforeEach(function () {
      sinon.stub(App.format, 'role', roleMock);
    });

    afterEach(function () {
      App.format.role.restore();
    });

    it('should format component name', function () {
      rootServiceComponents.set('componentName', 'DATANODE');
      expect(rootServiceComponents.get('displayName')).to.equal('Datanode');
    });

  });

});