public void ShouldThrowWhenUpdatingTwoInstancesOfSameDataAtTheSameTime()
        {
            // Arrange
            var correlationId        = Guid.NewGuid();
            IProcessManagerData data = new TestSqlServerData {
                CorrelationId = correlationId, Name = "TestDataUpdated"
            };
            var       xmlSerializer = new XmlSerializer(data.GetType());
            var       sww           = new StringWriter();
            XmlWriter writer        = XmlWriter.Create(sww);

            xmlSerializer.Serialize(writer, data);
            var dataXml = sww.ToString();

            SetupTestDbData(new List <TestDbRow> {
                new TestDbRow {
                    Id = correlationId.ToString(), DataXml = dataXml, Version = 1
                }
            });

            IProcessManagerFinder processManagerFinder = new SqlServerProcessManagerFinder(_connectionString, string.Empty, 1);

            var foundData1 = processManagerFinder.FindData <TestSqlServerData>(_mapper, new Message(correlationId));
            var foundData2 = processManagerFinder.FindData <TestSqlServerData>(_mapper, new Message(correlationId));

            processManagerFinder.UpdateData(foundData1); // first update should be fine

            // Act / Assert
            Assert.Throws <ArgumentException>(() => processManagerFinder.UpdateData(foundData2)); // second update should fail
        }
        public void ShouldFindData()
        {
            // Arrange
            var correlationId = Guid.NewGuid();

            var data = new TestSqlServerData {
                CorrelationId = correlationId, Name = "TestData"
            };
            var       xmlSerializer = new XmlSerializer(data.GetType());
            var       sww           = new StringWriter();
            XmlWriter writer        = XmlWriter.Create(sww);

            xmlSerializer.Serialize(writer, data);
            var dataXml = sww.ToString();

            SetupTestDbData(new List <TestDbRow> {
                new TestDbRow {
                    Id = correlationId.ToString(), DataXml = dataXml, Version = 1
                }
            });
            IProcessManagerFinder processManagerFinder = new SqlServerProcessManagerFinder(_connectionString, string.Empty);

            // Act
            var result = processManagerFinder.FindData <TestSqlServerData>(_mapper, new Message(correlationId));

            // Assert
            Assert.Equal("TestData", result.Data.Name);

            // Teardown - complete transaction
            processManagerFinder.UpdateData(result);
        }
        public void ShouldUpdateData()
        {
            // Arrange
            var correlationId = Guid.NewGuid();
            var testDataJson  = "{\"CorrelationId\":\"e845f0a0-4af0-4d1e-a324-790d49d540ae\",\"Name\":\"TestDataOriginal\"}";

            IProcessManagerData data = new TestSqlServerData {
                CorrelationId = correlationId, Name = "TestDataOriginal"
            };
            var       xmlSerializer = new XmlSerializer(data.GetType());
            var       sww           = new StringWriter();
            XmlWriter writer        = XmlWriter.Create(sww);

            xmlSerializer.Serialize(writer, data);
            var dataXml = sww.ToString();

            SetupTestDbData(new List <TestDbRow> {
                new TestDbRow {
                    Id = correlationId.ToString(), DataXml = dataXml
                }
            });

            IProcessManagerData updatedData = new TestSqlServerData {
                CorrelationId = correlationId, Name = "TestDataUpdated"
            };
            var sqlServerData = new SqlServerData <IProcessManagerData> {
                Data = updatedData, Id = correlationId
            };

            IProcessManagerFinder processManagerFinder = new SqlServerProcessManagerFinder(_connectionString, string.Empty);

            // Act
            //processManagerFinder.FindData<TestSqlServerData>(correlationId);
            processManagerFinder.FindData <TestSqlServerData>(_mapper, new Message(correlationId));
            processManagerFinder.UpdateData(sqlServerData);

            // Assert
            var results = GetTestDbData(correlationId);

            Assert.Equal(1, results.Count);
            Assert.Equal(correlationId.ToString(), results[0].Id);
            Assert.False(results[0].DataXml.Contains("TestDataOriginal"));
            Assert.True(results[0].DataXml.Contains("TestDataUpdated"));
        }
        public void ShouldThrowWhenUpdatingTwoInstancesOfSameDataAtTheSameTime()
        {
            // Arrange
            var correlationId = Guid.NewGuid();
            IProcessManagerData data = new TestSqlServerData { CorrelationId = correlationId, Name = "TestDataUpdated" };
            var xmlSerializer = new XmlSerializer(data.GetType());
            var sww = new StringWriter();
            XmlWriter writer = XmlWriter.Create(sww);
            xmlSerializer.Serialize(writer, data);
            var dataXml = sww.ToString();

            SetupTestDbData(new List<TestDbRow> { new TestDbRow { Id = correlationId.ToString(), DataXml = dataXml, Version = 1 } });

            IProcessManagerFinder processManagerFinder = new SqlServerProcessManagerFinder(_connectionString, string.Empty, 1);

            var foundData1 = processManagerFinder.FindData<TestSqlServerData>(_mapper, new Message(correlationId));
            var foundData2 = processManagerFinder.FindData<TestSqlServerData>(_mapper, new Message(correlationId));

            processManagerFinder.UpdateData(foundData1); // first update should be fine

            // Act / Assert
            Assert.Throws<ArgumentException>(() => processManagerFinder.UpdateData(foundData2)); // second update should fail
        }
        public void ShouldUpdateData()
        {
            // Arrange
            var correlationId = Guid.NewGuid();
            var testDataJson = "{\"CorrelationId\":\"e845f0a0-4af0-4d1e-a324-790d49d540ae\",\"Name\":\"TestDataOriginal\"}";

            IProcessManagerData data = new TestSqlServerData { CorrelationId = correlationId, Name = "TestDataOriginal" };
            var xmlSerializer = new XmlSerializer(data.GetType());
            var sww = new StringWriter();
            XmlWriter writer = XmlWriter.Create(sww);
            xmlSerializer.Serialize(writer, data);
            var dataXml = sww.ToString();
            SetupTestDbData(new List<TestDbRow> { new TestDbRow { Id = correlationId.ToString(), DataXml = dataXml } });

            IProcessManagerData updatedData = new TestSqlServerData { CorrelationId = correlationId, Name = "TestDataUpdated" };
            var sqlServerData = new SqlServerData<IProcessManagerData> { Data = updatedData, Id = correlationId };

            IProcessManagerFinder processManagerFinder = new SqlServerProcessManagerFinder(_connectionString, string.Empty);

            // Act
            //processManagerFinder.FindData<TestSqlServerData>(correlationId);
            processManagerFinder.FindData<TestSqlServerData>(_mapper, new Message(correlationId));
            processManagerFinder.UpdateData(sqlServerData);

            // Assert
            var results = GetTestDbData(correlationId);
            Assert.Equal(1, results.Count);
            Assert.Equal(correlationId.ToString(), results[0].Id);
            Assert.False(results[0].DataXml.Contains("TestDataOriginal"));
            Assert.True(results[0].DataXml.Contains("TestDataUpdated"));
        }
        public void ShouldFindData()
        {
            // Arrange
            var correlationId = Guid.NewGuid();

            var data = new TestSqlServerData {CorrelationId = correlationId, Name = "TestData"};
            var xmlSerializer = new XmlSerializer(data.GetType());
            var sww = new StringWriter();
            XmlWriter writer = XmlWriter.Create(sww);
            xmlSerializer.Serialize(writer, data);
            var dataXml = sww.ToString();

            SetupTestDbData(new List<TestDbRow> { new TestDbRow { Id = correlationId.ToString(), DataXml = dataXml, Version = 1} });
            IProcessManagerFinder processManagerFinder = new SqlServerProcessManagerFinder(_connectionString, string.Empty);

            // Act
            var result = processManagerFinder.FindData<TestSqlServerData>(_mapper, new Message(correlationId));

            // Assert
            Assert.Equal("TestData", result.Data.Name);

            // Teardown - complete transaction
            processManagerFinder.UpdateData(result);
        }