Example #1
0
        public void VsSessionHost_ResetBinding_ErrorInReadingSolutionBinding()
        {
            // Arrange
            var tracker      = new ConfigurableActiveSolutionTracker();
            var testSubject  = this.CreateTestSubject(tracker);
            var boundProject = new SonarQubeProject("bla", "");

            this.stateManager.SetBoundProject(boundProject);
            this.solutionBinding.CurrentBinding = new BoundSonarQubeProject(new Uri("http://bound"), boundProject.Key);
            var section = ConfigurableSectionController.CreateDefault();

            testSubject.SetActiveSection(section);

            // Sanity
            this.stateManager.BoundProject.Should().Be(boundProject);
            this.stepRunner.AbortAllNumberOfCalls.Should().Be(0);

            // Introduce an error
            this.solutionBinding.ReadSolutionBindingAction = () => { throw new Exception("boom"); };

            // Act (i.e. simulate loading a different solution)
            using (new AssertIgnoreScope()) // Ignore exception assert
            {
                tracker.SimulateActiveSolutionChanged();
            }

            // Assert
            this.stateManager.BoundProject.Should().BeNull();
        }
Example #2
0
        public void VsSessionHost_ResetBinding_BoundSolutionWithNoActiveSectionScenario()
        {
            // Arrange
            var tracker      = new ConfigurableActiveSolutionTracker();
            var testSubject  = this.CreateTestSubject(tracker);
            var boundProject = new SonarQubeProject("bla", "");

            this.solutionBinding.CurrentBinding = new Persistence.BoundSonarQubeProject(new Uri("http://bound"), boundProject.Key);
            this.stateManager.SetBoundProject(boundProject);

            // Sanity
            this.stateManager.BoundProject.Should().Be(boundProject);
            this.stepRunner.AbortAllNumberOfCalls.Should().Be(0);

            // Act (simulate solution opened event)
            tracker.SimulateActiveSolutionChanged();

            // Assert that nothing has changed (should defer all the work to when the section is connected)
            this.stepRunner.AbortAllNumberOfCalls.Should().Be(1);
            this.stateManager.BoundProject.Should().Be(boundProject);
            this.stateManager.BoundProjectKey.Should().BeNull("The key should only be set when there's active section to allow marking it once fetched all the projects");

            // Act (set active section)
            var  section       = ConfigurableSectionController.CreateDefault();
            bool refreshCalled = false;

            section.RefreshCommand = new RelayCommand(() => refreshCalled = true);
            testSubject.SetActiveSection(section);

            // Assert (section has refreshed, no further aborts were required)
            this.stepRunner.AbortAllNumberOfCalls.Should().Be(1);
            this.stateManager.BoundProjectKey.Should().Be(boundProject.Key, "Key was not set, will not be able to mark project as bound after refresh");
            this.stateManager.BoundProject.Should().Be(boundProject);
            refreshCalled.Should().BeTrue("Expected the refresh command to be called");
        }
Example #3
0
        public void VsSessionHost_ResetBinding_BoundSolutionWithActiveSectionScenario()
        {
            // Arrange
            var tracker      = new ConfigurableActiveSolutionTracker();
            var testSubject  = this.CreateTestSubject(tracker);
            var boundProject = new SonarQubeProject("bla", "");

            this.stateManager.SetBoundProject(boundProject);
            this.solutionBinding.CurrentBinding = new Persistence.BoundSonarQubeProject(new Uri("http://bound"), boundProject.Key);
            var  section       = ConfigurableSectionController.CreateDefault();
            bool refreshCalled = false;

            section.RefreshCommand = new RelayCommand(() => refreshCalled = true);
            testSubject.SetActiveSection(section);

            // Sanity
            this.stateManager.BoundProject.Should().Be(boundProject);
            this.stepRunner.AbortAllNumberOfCalls.Should().Be(0);

            // Act (simulate solution opened event)
            tracker.SimulateActiveSolutionChanged();

            // Assert
            this.stepRunner.AbortAllNumberOfCalls.Should().Be(1);
            this.stateManager.BoundProjectKey.Should().Be(boundProject.Key, "Key was not set, will not be able to mark project as bound after refresh");
            this.stateManager.BoundProject.Should().Be(boundProject);
            refreshCalled.Should().BeTrue("Expected the refresh command to be called");
        }
Example #4
0
        public void VsSessionHost_ResetBinding_ErrorInReadingBinding()
        {
            // Arrange
            var tracker     = new ConfigurableActiveSolutionTracker();
            var testSubject = this.CreateTestSubject(tracker);

            this.stateManager.SetBoundProject(new Uri("http://bound"), null, "bla");
            SetConfiguration(new BoundSonarQubeProject(new Uri("http://bound"), "bla", "projectName"), SonarLintMode.LegacyConnected);
            var section = ConfigurableSectionController.CreateDefault();

            testSubject.SetActiveSection(section);

            // Sanity
            this.stateManager.AssignedProjectKey.Should().Be("bla");
            this.stepRunner.AbortAllNumberOfCalls.Should().Be(0);

            // Introduce an error
            this.configProvider.GetConfigurationAction = () => { throw new Exception("boom"); };

            // Act (i.e. simulate loading a different solution)
            using (new AssertIgnoreScope()) // Ignore exception assert
            {
                tracker.SimulateActiveSolutionChanged(isSolutionOpen: true);
            }

            // Assert
            this.stateManager.AssignedProjectKey.Should().BeNull();
        }
        public void VsSessionHost_ResetBinding_NoOpenSolutionScenario()
        {
            // Arrange
            var tracker = new ConfigurableActiveSolutionTracker();

            this.CreateTestSubject(tracker);
            // Previous binding information that should be cleared once there's no solution
            var boundProject = new Integration.Service.ProjectInformation {
                Key = "bla"
            };

            this.stateManager.BoundProjectKey = boundProject.Key;
            this.stateManager.SetBoundProject(boundProject);

            // Sanity
            this.stateManager.BoundProject.Should().Be(boundProject);
            this.stepRunner.AbortAllNumberOfCalls.Should().Be(0);

            // Act
            tracker.SimulateActiveSolutionChanged();

            // Assert
            this.stepRunner.AbortAllNumberOfCalls.Should().Be(1);
            this.stateManager.BoundProject.Should().BeNull();
            this.stateManager.BoundProjectKey.Should().BeNull("Expecting the key to be reset to null");
        }
Example #6
0
        public void VsSessionHost_ResetBinding_BoundSolutionWithActiveSectionScenario()
        {
            // Arrange
            var tracker     = new ConfigurableActiveSolutionTracker();
            var testSubject = this.CreateTestSubject(tracker);

            this.stateManager.SetBoundProject(new Uri("http://bound"), "org1", "bla");
            SetConfiguration(new BoundSonarQubeProject(new Uri("http://bound"), "bla", "projectName"), SonarLintMode.LegacyConnected);
            var  section       = ConfigurableSectionController.CreateDefault();
            bool refreshCalled = false;

            section.RefreshCommand = new RelayCommand <ConnectionInformation>(c => refreshCalled = true);
            testSubject.SetActiveSection(section);

            // Sanity
            this.stateManager.AssignedProjectKey.Should().Be("bla");
            this.stepRunner.AbortAllNumberOfCalls.Should().Be(0);

            // Act (simulate solution opened event)
            tracker.SimulateActiveSolutionChanged(isSolutionOpen: true);

            // Assert
            this.stepRunner.AbortAllNumberOfCalls.Should().Be(1);
            this.stateManager.BoundProjectKey.Should().Be("bla", "Key was not set, will not be able to mark project as bound after refresh");
            this.stateManager.AssignedProjectKey.Should().Be("bla");
            refreshCalled.Should().BeTrue("Expected the refresh command to be called");
        }
        public void VsSessionHost_ResetBinding_ErrorInReadingSolutionBinding()
        {
            // Setup
            var tracker      = new ConfigurableActiveSolutionTracker();
            var testSubject  = this.CreateTestSubject(tracker);
            var boundProject = new Integration.Service.ProjectInformation {
                Key = "bla"
            };

            this.stateManager.SetBoundProject(boundProject);
            this.solutionBinding.CurrentBinding = new Persistence.BoundSonarQubeProject(new Uri("http://bound"), boundProject.Key);
            var section = ConfigurableSectionController.CreateDefault();

            testSubject.SetActiveSection(section);

            // Sanity
            this.stateManager.AssertBoundProject(boundProject);
            this.stepRunner.AssertAbortAllCalled(0);

            // Introduce an error
            this.solutionBinding.ReadSolutionBindingAction = () => { throw new Exception("boom"); };

            // Act (i.e. simulate loading a different solution)
            using (new AssertIgnoreScope()) // Ignore exception assert
            {
                tracker.SimulateActiveSolutionChanged();
            }

            // Verify
            this.stateManager.AssertNoBoundProject();
        }
        public void VsSessionHost_ResetBinding_BoundSolutionWithActiveSectionScenario()
        {
            // Setup
            var tracker      = new ConfigurableActiveSolutionTracker();
            var testSubject  = this.CreateTestSubject(tracker);
            var boundProject = new Integration.Service.ProjectInformation {
                Key = "bla"
            };

            this.stateManager.SetBoundProject(boundProject);
            this.solutionBinding.CurrentBinding = new Persistence.BoundSonarQubeProject(new Uri("http://bound"), boundProject.Key);
            var  section       = ConfigurableSectionController.CreateDefault();
            bool refreshCalled = false;

            section.RefreshCommand = new RelayCommand(() => refreshCalled = true);
            testSubject.SetActiveSection(section);

            // Sanity
            this.stateManager.AssertBoundProject(boundProject);
            this.stepRunner.AssertAbortAllCalled(0);

            // Act (simulate solution opened event)
            tracker.SimulateActiveSolutionChanged();

            // Verify
            this.stepRunner.AssertAbortAllCalled(1);
            Assert.AreEqual(boundProject.Key, this.stateManager.BoundProjectKey, "Key was not set, will not be able to mark project as bound after refresh");
            this.stateManager.AssertBoundProject(boundProject);
            Assert.IsTrue(refreshCalled, "Expected the refresh command to be called");
        }
Example #9
0
        private VsSessionHost CreateTestSubject(ConfigurableActiveSolutionTracker tracker)
        {
            this.stateManager = new ConfigurableStateManager();
            var host = new VsSessionHost(this.serviceProvider,
                                         stateManager,
                                         this.stepRunner,
                                         this.sonarQubeServiceMock.Object,
                                         tracker ?? new ConfigurableActiveSolutionTracker(),
                                         Dispatcher.CurrentDispatcher);

            this.stateManager.Host = host;

            host.ReplaceInternalServiceForTesting <ISolutionBindingSerializer>(this.solutionBinding);

            return(host);
        }
Example #10
0
        public void VsSessionHost_ResetBinding_NoOpenSolutionScenario()
        {
            // Arrange
            var tracker = new ConfigurableActiveSolutionTracker();

            this.CreateTestSubject(tracker);

            this.stateManager.BoundProjectKey = "bla";
            this.stateManager.SetBoundProject(new Uri("http://localhost"), null, "bla");

            // Sanity
            this.stateManager.AssignedProjectKey.Should().Be("bla");
            this.stepRunner.AbortAllNumberOfCalls.Should().Be(0);

            // Act
            tracker.SimulateActiveSolutionChanged(isSolutionOpen: false);

            // Assert
            this.stepRunner.AbortAllNumberOfCalls.Should().Be(1);
            this.stateManager.AssignedProjectKey.Should().BeNull();
            this.stateManager.BoundProjectKey.Should().BeNull("Expecting the key to be reset to null");
        }
        private VsSessionHost CreateTestSubject(ConfigurableActiveSolutionTracker tracker)
        {
            this.stateManager = new ConfigurableStateManager();
            var host = new VsSessionHost(this.serviceProvider,
                stateManager, 
                this.stepRunner,
                this.sonarQubeService, 
                tracker?? new ConfigurableActiveSolutionTracker(),
                Dispatcher.CurrentDispatcher);

            this.stateManager.Host = host;

            host.ReplaceInternalServiceForTesting<ISolutionBindingSerializer>(this.solutionBinding);

            return host;
        }
        public void VsSessionHost_ResetBinding_ErrorInReadingSolutionBinding()
        {
            // Setup
            var tracker = new ConfigurableActiveSolutionTracker();
            var testSubject = this.CreateTestSubject(tracker);
            var boundProject = new Integration.Service.ProjectInformation { Key = "bla" };
            this.stateManager.SetBoundProject(boundProject);
            this.solutionBinding.CurrentBinding = new Persistence.BoundSonarQubeProject(new Uri("http://bound"), boundProject.Key);
            var section = ConfigurableSectionController.CreateDefault();
            testSubject.SetActiveSection(section);

            // Sanity
            this.stateManager.AssertBoundProject(boundProject);
            this.stepRunner.AssertAbortAllCalled(0);

            // Introduce an error
            this.solutionBinding.ReadSolutionBindingAction = () => { throw new Exception("boom"); };

            // Act (i.e. simulate loading a different solution)
            using (new AssertIgnoreScope()) // Ignore exception assert
            {
                tracker.SimulateActiveSolutionChanged();
            }

            // Verify
            this.stateManager.AssertNoBoundProject();
        }
        public void VsSessionHost_ResetBinding_BoundSolutionWithActiveSectionScenario()
        {
            // Setup
            var tracker = new ConfigurableActiveSolutionTracker();
            var testSubject = this.CreateTestSubject(tracker);
            var boundProject = new Integration.Service.ProjectInformation { Key = "bla" };
            this.stateManager.SetBoundProject(boundProject);
            this.solutionBinding.CurrentBinding = new Persistence.BoundSonarQubeProject(new Uri("http://bound"), boundProject.Key);
            var section = ConfigurableSectionController.CreateDefault();
            bool refreshCalled = false;
            section.RefreshCommand = new RelayCommand(() => refreshCalled = true);
            testSubject.SetActiveSection(section);

            // Sanity
            this.stateManager.AssertBoundProject(boundProject);
            this.stepRunner.AssertAbortAllCalled(0);

            // Act (simulate solution opened event)
            tracker.SimulateActiveSolutionChanged();

            // Verify
            this.stepRunner.AssertAbortAllCalled(1);
            Assert.AreEqual(boundProject.Key, this.stateManager.BoundProjectKey, "Key was not set, will not be able to mark project as bound after refresh");
            this.stateManager.AssertBoundProject(boundProject);
            Assert.IsTrue(refreshCalled, "Expected the refresh command to be called");
        }
        public void VsSessionHost_ResetBinding_BoundSolutionWithNoActiveSectionScenario()
        {
            // Setup
            var tracker = new ConfigurableActiveSolutionTracker();
            var testSubject = this.CreateTestSubject(tracker);
            var boundProject = new Integration.Service.ProjectInformation { Key = "bla" };
            this.solutionBinding.CurrentBinding = new Persistence.BoundSonarQubeProject(new Uri("http://bound"), boundProject.Key);
            this.stateManager.SetBoundProject(boundProject);

            // Sanity
            this.stateManager.AssertBoundProject(boundProject);
            this.stepRunner.AssertAbortAllCalled(0);

            // Act (simulate solution opened event)
            tracker.SimulateActiveSolutionChanged();

            // Verify that nothing has changed (should defer all the work to when the section is connected)
            this.stepRunner.AssertAbortAllCalled(1);
            this.stateManager.AssertBoundProject(boundProject);
            Assert.IsNull(this.stateManager.BoundProjectKey, "The key should only be set when there's active section to allow marking it once fetched all the projects");

            // Act (set active section)
            var section = ConfigurableSectionController.CreateDefault();
            bool refreshCalled = false;
            section.RefreshCommand = new RelayCommand(() => refreshCalled = true);
            testSubject.SetActiveSection(section);

            // Verify (section has refreshed, no further aborts were required)
            this.stepRunner.AssertAbortAllCalled(1);
            Assert.AreEqual(boundProject.Key, this.stateManager.BoundProjectKey, "Key was not set, will not be able to mark project as bound after refresh");
            this.stateManager.AssertBoundProject(boundProject);
            Assert.IsTrue(refreshCalled, "Expected the refresh command to be called");
        }
        public void VsSessionHost_ResetBinding_NoOpenSolutionScenario()
        {
            // Setup
            var tracker = new ConfigurableActiveSolutionTracker();
            this.CreateTestSubject(tracker);
            // Previous binding information that should be cleared once there's no solution
            var boundProject = new Integration.Service.ProjectInformation { Key = "bla" };
            this.stateManager.BoundProjectKey = boundProject.Key;
            this.stateManager.SetBoundProject(boundProject);

            // Sanity
            this.stateManager.AssertBoundProject(boundProject);
            this.stepRunner.AssertAbortAllCalled(0);

            // Act
            tracker.SimulateActiveSolutionChanged();

            // Verify
            this.stepRunner.AssertAbortAllCalled(1);
            this.stateManager.AssertNoBoundProject();
            Assert.IsNull(this.stateManager.BoundProjectKey, "Expecting the key to be reset to null");
        }