public void LoadIntoDatabase()
        {
            var records = ParserHelper.ParseRecords(Records);

            using (var connection = _fixture.CreateConnection())
            {
                connection.Open();
                var loader = new ScheduleHeaderLoader(connection, new Sequence(), Substitute.For <ILogger>());
                loader.Initialise();

                foreach (var record in records)
                {
                    var schedule = record as Schedule;
                    loader.Add(schedule.GetId(), schedule.GetScheduleDetails(), schedule.GetScheduleExtraDetails());
                }

                using (var transaction = connection.BeginTransaction())
                {
                    loader.Load(transaction);

                    using (var command = connection.CreateCommand())
                    {
                        command.Transaction = transaction;
                        command.CommandText = "SELECT * FROM Schedules";
                        using (var adapter = new SqlDataAdapter(command))
                        {
                            var table = new DataTable();
                            adapter.Fill(table);
                            Assert.Equal(3, table.Rows.Count);
                        };
                    }
                }
            }
        }
        public void CreateDataTableWithLocationColumns()
        {
            using (var connection = _fixture.CreateConnection())
            {
                connection.Open();
                var loader = new ScheduleHeaderLoader(connection, new Sequence(), Substitute.For <ILogger>());
                loader.Initialise();
                var table = loader.Table;

                Assert.Equal(27, table.Columns.Count);
                Assert.NotNull(table.Columns["TimetableUid"]);
            }
        }
        private ScheduleLoader InitialiseLoader(SqlConnection connection)
        {
            var sequence = new Sequence();
            var lookup   = Substitute.For <IDatabaseIdLookup>();

            lookup.Find(Arg.Any <string>()).Returns(c => sequence.GetNext());
            _schedules = new ScheduleHeaderLoader(connection, new Sequence(), Substitute.For <ILogger>());
            _locations = new ScheduleLocationLoader(connection, new Sequence(), lookup, Substitute.For <ILogger>());
            _changes   = new ScheduleChangeLoader(connection, new Sequence(), Substitute.For <ILogger>());
            var loader = new ScheduleLoader(_schedules, _locations, _changes, Substitute.For <ILogger>());

            loader.Initialise();
            return(loader);
        }
        public void AddInsert()
        {
            var records = ParserHelper.ParseRecords(Records);

            using (var connection = _fixture.CreateConnection())
            {
                connection.Open();
                var loader = new ScheduleHeaderLoader(connection, new Sequence(), Substitute.For <ILogger>());
                loader.Initialise();

                var schedule = records[0] as Schedule;
                loader.Add(schedule.GetId(), schedule.GetScheduleDetails(), schedule.GetScheduleExtraDetails());

                var row = loader.Table.Rows[0];
                Assert.Equal(1L, row["Id"]);
                Assert.Equal("I", row["Action"]);
                Assert.Equal("P", row["StpIndicator"]);
                Assert.Equal("C55855", row["TimetableUid"]);
                Assert.Equal(new DateTime(2019, 10, 26), row["RunsFrom"]);
                Assert.Equal(new DateTime(2019, 12, 14), row["RunsTo"]);
                Assert.Equal((byte)32, row["DayMask"]);
                Assert.Equal("", row["BankHolidayRunning"]);
                Assert.Equal("P", row["Status"]);
                Assert.Equal("EE", row["Category"]);
                Assert.Equal("5P92", row["TrainIdentity"]);
                Assert.Equal(DBNull.Value, row["NrsHeadCode"]);
                Assert.Equal("25476001", row["ServiceCode"]);
                Assert.Equal(DBNull.Value, row["PortionId"]);
                Assert.Equal("DMU", row["PowerType"]);
                Assert.Equal("S", row["TimingLoadType"]);
                Assert.Equal(75, row["Speed"]);
                Assert.Equal(DBNull.Value, row["OperatingCharacteristics"]);
                Assert.Equal("B", row["SeatClass"]);
                Assert.Equal(DBNull.Value, row["SleeperClass"]);
                Assert.Equal("", row["ReservationIndicator"]);
                Assert.Equal(DBNull.Value, row["Catering"]);
                Assert.Equal(DBNull.Value, row["Branding"]);
                Assert.Equal(DBNull.Value, row["EuropeanUic"]);
                Assert.Equal("GW", row["Toc"]);
                Assert.Equal(true, row["ApplicableTimetable"]);
                Assert.Equal(DBNull.Value, row["RetailServiceId"]);
            }
        }
        public void EachScheduleHasUniqueDatabaseId()
        {
            var records = ParserHelper.ParseRecords(Records);

            using (var connection = _fixture.CreateConnection())
            {
                connection.Open();
                var loader = new ScheduleHeaderLoader(connection, new Sequence(), Substitute.For <ILogger>());
                loader.Initialise();

                var ids = new List <long>();
                foreach (var record in records)
                {
                    var schedule = record as Schedule;
                    var id       = loader.Add(schedule.GetId(), schedule.GetScheduleDetails(), schedule.GetScheduleExtraDetails());
                    ids.Add(id);
                }

                Assert.Equal(ids.Count, ids.Distinct().Count());
            }
        }
        public void SkipsDatabaseIdWhenHaveBxRecord()
        {
            var records = ParserHelper.ParseRecords(Records);

            using (var connection = _fixture.CreateConnection())
            {
                connection.Open();
                var loader = new ScheduleHeaderLoader(connection, new Sequence(), Substitute.For <ILogger>());
                loader.Initialise();

                var ids = new List <long>();
                foreach (var record in records)
                {
                    var schedule = record as Schedule;
                    var id       = loader.Add(schedule.GetId(), schedule.GetScheduleDetails(), schedule.GetScheduleExtraDetails());
                    ids.Add(id);
                }

                Assert.Equal(1, ids[0]);
                Assert.Equal(3, ids[1]);    // First schedule has BS and BX so next skips 1 Id
                Assert.Equal(4, ids[2]);    // Second schedule only has BS
            }
        }
        public void AddDelete()
        {
            var records = ParserHelper.ParseRecords(Records);

            using (var connection = _fixture.CreateConnection())
            {
                connection.Open();
                var loader = new ScheduleHeaderLoader(connection, new Sequence(), Substitute.For <ILogger>());
                loader.Initialise();

                var schedule = records[1] as Schedule;
                loader.Add(schedule.GetId(), schedule.GetScheduleDetails(), schedule.GetScheduleExtraDetails());

                var row = loader.Table.Rows[0];
                Assert.Equal(1L, row["Id"]);
                Assert.Equal("D", row["Action"]);
                Assert.Equal("P", row["StpIndicator"]);
                Assert.Equal("Y31280", row["TimetableUid"]);
                Assert.Equal(new DateTime(2019, 10, 27), row["RunsFrom"]);

                //Everything else is null
                Assert.Equal(22, row.ItemArray.Count(o => DBNull.Value.Equals(o)));
            }
        }