/**
 * 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 { MatCardModule } from '@angular/material/card';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AppNodeUtilizationComponent } from '@app/components/app-node-utilization/app-node-utilization.component';
import { BarChartComponent } from '@app/components/bar-chart/bar-chart.component';

describe('AppNodeUtilizationComponent', () => {
  let component: AppNodeUtilizationComponent;
  let fixture: ComponentFixture<AppNodeUtilizationComponent>;

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [AppNodeUtilizationComponent, BarChartComponent],
      imports: [MatCardModule],
    });
    fixture = TestBed.createComponent(AppNodeUtilizationComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});
