public void WhenNoProjectsLoaded_ThenRootNodeIsEmptyAndProjectPickerOpens()
        {
            var projectPicker = new Mock <IProjectPickerDialog>();

            projectPicker.Setup(p => p.SelectProjectId(It.IsAny <IWin32Window>())).Returns((string)null);

            this.serviceRegistry.AddSingleton <IProjectPickerDialog>(projectPicker.Object);
            this.serviceRegistry.AddMock <IComputeEngineAdapter>();

            // Open window.
            var window = new ProjectExplorerWindow(this.serviceProvider);

            window.ShowWindow();
            PumpWindowMessages();

            // Check tree.
            var rootNode = GetRootNode(window);

            Assert.IsInstanceOf(typeof(CloudNode), rootNode);
            Assert.AreEqual(0, rootNode.Nodes.Count);

            // Check picker
            projectPicker.Verify(p => p.SelectProjectId(It.IsAny <IWin32Window>()), Times.Once);

            Assert.IsNull(this.ExceptionShown);
        }
        public void WhenProjectAdded_ThenLinuxInstancesAndInstancesWithoutDiskAreIgnored()
        {
            // Add a project.
            this.serviceProvider.GetService <IProjectRepository>().AddProjectAsync("project-1").Wait();

            // Add some instances.
            var instances = new[]
            {
                CreateInstance("windows", "antarctica1-a", true),
                CreateInstance("linux", "antarctica1-b", false),
                new Instance()
                {
                    Id          = 1,
                    Name        = "nodisk",
                    Zone        = "projects/-/zones/antarctica1-a",
                    MachineType = "zones/-/machineTypes/n1-standard-1"
                }
            };

            // Open window.
            var computeEngineAdapter = new Mock <IComputeEngineAdapter>();

            this.serviceRegistry.AddSingleton <IComputeEngineAdapter>(computeEngineAdapter.Object);
            computeEngineAdapter
            .Setup(o => o.ListInstancesAsync("project-1", It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult <IEnumerable <Instance> >(instances));

            var window = new ProjectExplorerWindow(this.serviceProvider);

            window.ShowWindow();
            PumpWindowMessages();

            // Check tree.
            var rootNode = GetRootNode(window);

            Assert.IsInstanceOf(typeof(CloudNode), rootNode);
            Assert.AreEqual(1, rootNode.Nodes.Count);

            var projectNode = (ProjectNode)rootNode.FirstNode;

            Assert.AreEqual("project-1", projectNode.Text);
            Assert.AreEqual(1, projectNode.Nodes.Count);

            var zoneAnode = (ZoneNode)projectNode.FirstNode;

            Assert.AreEqual("antarctica1-a", zoneAnode.Text);
            Assert.AreEqual(1, zoneAnode.Nodes.Count);

            var vmNode = (VmInstanceNode)zoneAnode.FirstNode;

            Assert.AreEqual(0, vmNode.Nodes.Count);
            Assert.AreEqual("windows", vmNode.Text);

            Assert.IsNull(this.ExceptionShown);
        }
        public void WhenProjectAdded_ThenLinuxInstancesAreListed()
        {
            // Add a project.
            this.serviceProvider.GetService <IProjectRepository>().AddProjectAsync("project-1").Wait();

            // Add some instances.
            var instances = new[]
            {
                CreateInstance("windows", "antarctica1-a", true),
                CreateInstance("linux", "antarctica1-b", false)
            };

            // Open window.
            var computeEngineAdapter = new Mock <IComputeEngineAdapter>();

            this.serviceRegistry.AddSingleton <IComputeEngineAdapter>(computeEngineAdapter.Object);
            computeEngineAdapter
            .Setup(o => o.ListInstancesAsync("project-1", It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult <IEnumerable <Instance> >(instances));

            var window = new ProjectExplorerWindow(this.serviceProvider);

            window.ShowWindow();
            Delay(TimeSpan.FromMilliseconds(100));

            // Check tree.
            var rootNode = GetRootNode(window);

            Assert.IsInstanceOf(typeof(CloudNode), rootNode);
            Assert.AreEqual(1, rootNode.Nodes.Count);

            var projectNode = (ProjectNode)rootNode.FirstNode;

            Assert.AreEqual("project-1", projectNode.Text);
            Assert.AreEqual(2, projectNode.Nodes.Count);

            var zoneAnode = (ZoneNode)projectNode.FirstNode;

            Assert.AreEqual("antarctica1-a", zoneAnode.Text);
            Assert.AreEqual(1, zoneAnode.Nodes.Count);

            var zoneBnode = (ZoneNode)projectNode.LastNode;

            Assert.AreEqual("antarctica1-b", zoneBnode.Text);
            Assert.AreEqual(1, zoneBnode.Nodes.Count);

            Assert.AreEqual("windows", ((VmInstanceNode)zoneAnode.FirstNode).Text);
            Assert.AreEqual("linux", ((VmInstanceNode)zoneBnode.FirstNode).Text);

            Assert.IsNull(this.ExceptionShown);
        }
        public void WhenProjectAdded_ThenWindowsInstancesAreListed()
        {
            // Add a project.
            this.serviceProvider.GetService <ProjectInventoryService>().AddProjectAsync("project-1").Wait();

            // Add some instances.
            var instances = new[]
            {
                CreateInstance("instance-1a", "antarctica1-a", true),
                CreateInstance("instance-1b", "antarctica1-b", true)
            };

            // Open window.
            var computeEngineAdapter = new Mock <IComputeEngineAdapter>();

            this.serviceRegistry.AddSingleton <IComputeEngineAdapter>(computeEngineAdapter.Object);
            computeEngineAdapter
            .Setup(o => o.QueryInstancesAsync("project-1"))
            .Returns(Task.FromResult <IEnumerable <Instance> >(instances));

            var window = new ProjectExplorerWindow(this.serviceProvider);

            window.ShowWindow();
            PumpWindowMessages();

            // Check tree.
            var rootNode = GetRootNode(window);

            Assert.IsInstanceOf(typeof(CloudNode), rootNode);
            Assert.AreEqual(1, rootNode.Nodes.Count);

            var projectNode = (ProjectNode)rootNode.FirstNode;

            Assert.AreEqual("project-1", projectNode.Text);
            Assert.AreEqual(2, projectNode.Nodes.Count);

            var zoneAnode = (ZoneNode)projectNode.FirstNode;

            Assert.AreEqual("antarctica1-a", zoneAnode.Text);
            Assert.AreEqual(1, zoneAnode.Nodes.Count);

            var vmNode = (VmInstanceNode)zoneAnode.FirstNode;

            Assert.AreEqual("instance-1a", vmNode.Text);
            Assert.AreEqual(0, vmNode.Nodes.Count);

            Assert.IsNull(this.ExceptionShown);
        }
        public void WhenQueryInstanceFails_ProjectIsShownAsEmpty()
        {
            // Add a project.
            this.serviceProvider.GetService <IProjectRepository>().AddProjectAsync("valid-project").Wait();
            this.serviceProvider.GetService <IProjectRepository>().AddProjectAsync("forbidden-project").Wait();

            // Add some instances to project-1.
            var instances = new[]
            {
                CreateInstance("windows", "antarctica1-a", true)
            };

            // Open window.
            var computeEngineAdapter = new Mock <IComputeEngineAdapter>();

            this.serviceRegistry.AddSingleton <IComputeEngineAdapter>(computeEngineAdapter.Object);

            computeEngineAdapter
            .Setup(o => o.ListInstancesAsync("valid-project", It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult <IEnumerable <Instance> >(instances));
            computeEngineAdapter
            .Setup(o => o.ListInstancesAsync("forbidden-project", It.IsAny <CancellationToken>()))
            .Throws(new AdapterException("Access denied or something", null));

            var window = new ProjectExplorerWindow(this.serviceProvider);

            window.ShowWindow();
            PumpWindowMessages();

            // Check tree.
            var rootNode = GetRootNode(window);

            Assert.AreEqual(2, rootNode.Nodes.Cast <ProjectNode>().Count());

            var projectNode = rootNode.Nodes.Cast <ProjectNode>()
                              .Where(n => n.ProjectId == "forbidden-project")
                              .FirstOrDefault();;

            Assert.AreEqual(0, projectNode.Nodes.Count);
        }