import {getTestBed, TestBed} from '@angular/core/testing';
import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
import {NgRedux} from "@angular-redux/store";
import {DrawingBoardTreeService, TreeNodeContextMenuModel} from "./drawing-board-tree.service";
import {ITreeNode} from "angular-tree-component/dist/defs/api";

class MockAppStore<T> {
  getState() {
    return {
      service: {
        serviceInstance: {
          "serviceInstanceId": {
            vnfs: {
              "vnfStoreKey": {
                isMissingData: true,
                vfModules: {
                  "vfModulesName": {
                    "vfModulesName": {
                      isMissingData: true
                    }
                  }
                }
              },

              "vnfStoreKey1": {
                isMissingData: false,
                vfModules: {
                  "vfModulesName": {
                    "vfModulesName": {
                      isMissingData: false
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

describe('Drawing board tree Service', () => {
  let injector;
  let service: DrawingBoardTreeService;
  let httpMock: HttpTestingController;


  beforeAll(done => (async () => {
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers: [
        DrawingBoardTreeService,
        {provide: NgRedux, useClass: MockAppStore}]
    });
    await TestBed.compileComponents();

    injector = getTestBed();
    service = injector.get(DrawingBoardTreeService);
    httpMock = injector.get(HttpTestingController);

  })().then(done).catch(done.fail));


  test('generateContextMenuOptions should return list of optional context menu', () => {
    const options: TreeNodeContextMenuModel[] = service.generateContextMenuOptions();
    const expected: TreeNodeContextMenuModel[] = [
      new TreeNodeContextMenuModel('edit', 'context-menu-edit', 'Edit', 'edit-file-o'),
      new TreeNodeContextMenuModel('duplicate', 'context-menu-duplicate', 'Duplicate', 'copy-o'),
      new TreeNodeContextMenuModel('showAuditInfo', 'context-menu-showAuditInfo', 'Show audit info', 'eye-o'),
      new TreeNodeContextMenuModel('addGroupMember', 'context-menu-addGroupMember', 'Add group members', 'plus'),
      new TreeNodeContextMenuModel('delete', 'context-menu-delete', 'Delete', 'trash-o'),
      new TreeNodeContextMenuModel('remove', 'context-menu-remove', 'Remove', 'trash-o'),
      new TreeNodeContextMenuModel('upgrade', 'context-menu-upgrade', 'Upgrade', 'upgrade'),
      new TreeNodeContextMenuModel('undoDelete', 'context-menu-undoDelete', 'Undo Delete', 'undo-delete'),
      new TreeNodeContextMenuModel('undoUpgrade', 'context-menu-undoUpgrade', 'Undo Upgrade', 'undo-delete'),
      new TreeNodeContextMenuModel('changeAssociations', 'context-menu-changeAssociations', 'Change Associations', 'edit-file-o')
    ];
    expect(options.length).toEqual(10);
    expect(options).toEqual(expected);
  });

  test('isVNFMissingData should return true if vnf isMissingData = true', () => {
    let node: ITreeNode = <any>{
      data: {
        type: 'VF',
        vnfStoreKey: "vnfStoreKey"
      }
    };
    let result: boolean = service.isVNFMissingData(node, "serviceInstanceId");
    expect(result).toBeTruthy();
  });


  test('isVNFMissingData should return false if vnf has isMissingData = false', () => {
    let node: ITreeNode = <any>{
      data: {
        type: 'VFModule',
        modelName: "vfModulesName",
        dynamicModelName: "vfModulesName",
        parent: {
          vnfStoreKey: "vnfStoreKey1",
          type: 'VF'
        }
      }
    };
    let result: boolean = service.isVNFMissingData(node, "serviceInstanceId");
    expect(result).toBeFalsy();
  });


  test('isVFModuleMissingData should return true if vnfModule has isMissingData = true', () => {
    let node: ITreeNode = <any>{
      data: {
        type: 'VFModule',
        modelName: "vfModulesName",
        dynamicModelName: "vfModulesName",
        parent: {
          vnfStoreKey: "vnfStoreKey",
          type: 'VF'
        }
      }
    };
    let result: boolean = service.isVFModuleMissingData(node, "serviceInstanceId");
    expect(result).toBeFalsy();
  });


  test('isVFModuleMissingData should return false if vnfModule has isMissingData = false', () => {
    let node: ITreeNode = <any>{
      data: {
        type: 'VFModule',
        modelName: "vfModulesName",
        dynamicModelName: "vfModulesName",
        parent: {
          vnfStoreKey: "vnfStoreKey1",
          type: 'VF'
        }
      }
    };
    let result: boolean = service.isVFModuleMissingData(node, "serviceInstanceId");
    expect(result).toBeFalsy();
  });

});