public void ChangePasswordOnMultipleHostsWithError()
        {
            var pwHostEntries = new Collection <IHostPwEntry>()
            {
                new InMemoryHostPwEntry()
                {
                    IPAddress = "localhost1",
                    Username  = "******",
                    Password  = "******"
                },
                new InMemoryHostPwEntry()
                {
                    IPAddress = "localhost2",
                    Username  = "******",
                    Password  = "******"
                },
                new InMemoryHostPwEntry()
                {
                    IPAddress = "localhost3",
                    Username  = "******",
                    Password  = "******"
                },
            };

            var mock = new Mock <IPasswordChangerService>();

            mock.CallBase = true;
            mock.Setup(
                m => m.ChangePassword(
                    It.Is <IHostPwEntry>(x => x.IPAddress == pwHostEntries[1].IPAddress),
                    It.IsAny <String>()
                    )
                ).Throws <Exception>();

            var batchPasswordChangerWorker = new BatchPasswordChangerWorker(mock.Object, pwHostEntries, "newPassword");

            batchPasswordChangerWorker.SaveDatabaseAfterEachUpdate = true;

            int changedEventCount   = 0;
            int errorEventCount     = 0;
            int completedEventCount = 0;

            batchPasswordChangerWorker.Changed   += (o, e) => { changedEventCount++; };
            batchPasswordChangerWorker.Error     += (o, e) => { errorEventCount++; };
            batchPasswordChangerWorker.Completed += (o, e) => { completedEventCount++; };
            batchPasswordChangerWorker.Run();

            Assert.AreEqual(2, changedEventCount);
            Assert.AreEqual(1, errorEventCount);
            Assert.AreEqual(1, completedEventCount);

            mock.Verify(x => x.ChangePassword(pwHostEntries[0], "newPassword"), Times.Once);
            mock.Verify(x => x.ChangePassword(pwHostEntries[2], "newPassword"), Times.Once);

            mock.Verify(x => x.SaveDatabase(), Times.Exactly(2));
        }
        public void ChangePasswordOnMultipleHostsAndSaveDatabaseAfterEachUpdate()
        {
            var passwordChangerService = new MockPasswordChangerService();
            var pwHostEntries          = new Collection <IHostPwEntry>()
            {
                new InMemoryHostPwEntry()
                {
                    IPAddress = "localhost1",
                    Username  = "******",
                    Password  = "******"
                },
                new InMemoryHostPwEntry()
                {
                    IPAddress = "localhost2",
                    Username  = "******",
                    Password  = "******"
                },
            };
            var batchPasswordChangerWorker = new BatchPasswordChangerWorker(passwordChangerService, pwHostEntries, "newPassword");

            batchPasswordChangerWorker.SaveDatabaseAfterEachUpdate = true;

            int changedEventCount   = 0;
            int errorEventCount     = 0;
            int completedEventCount = 0;

            batchPasswordChangerWorker.Changed   += (o, e) => { changedEventCount++; };
            batchPasswordChangerWorker.Error     += (o, e) => { errorEventCount++; };
            batchPasswordChangerWorker.Completed += (o, e) => { completedEventCount++; };
            batchPasswordChangerWorker.Run();

            Assert.AreEqual(pwHostEntries.Count, changedEventCount);
            Assert.AreEqual(0, errorEventCount);
            Assert.AreEqual(1, completedEventCount);

            Assert.AreEqual(pwHostEntries.Count, passwordChangerService.ChangePasswordCount);
            Assert.AreEqual(pwHostEntries.Count, passwordChangerService.SaveDatabaseCount);
        }