public void AddOrUpdateLoadout_SameDiscordIdAndSameNameButDifferentDestinyCharacter_ShouldWriteBothToDatabase()
        {
            ulong       discordId          = 221313820847636491;
            long        destinyCharacterId = 2305843009504575107;
            uint        izanagiHash        = 3211806999;
            long        izanagiInstanceId  = 6917529135183883487;
            string      loadoutName        = "crucible";
            DestinyItem izanagiItem        = new DestinyItem(izanagiInstanceId, "Izanagi's Burden", new List <string>()
            {
                "Weapon", "Kinetic Weapon", "Sniper Rifle"
            }, izanagiHash, new List <uint>()
            {
                2, 1, 10
            }, "Exotic");
            Loadout loadout = new Loadout(discordId, destinyCharacterId, loadoutName, new List <DestinyItem>()
            {
                izanagiItem
            });
            Loadout loadout2 = new Loadout(discordId, 69, loadoutName, new List <DestinyItem>()
            {
            });

            using (SqliteConnection connection = new SqliteConnection("DataSource=:memory:")) {
                connection.Open();
                DbContextOptions <EmissaryDbContext> options = new DbContextOptionsBuilder <EmissaryDbContext>()
                                                               .UseSqlite(connection)
                                                               .Options;
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    dbContext.Database.EnsureCreated();
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    LoadoutDao loadoutDao = new LoadoutDao(dbContext);
                    loadoutDao.AddOrUpdateLoadout(loadout);
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    Assert.AreEqual(1, dbContext.Loadouts.Count());
                    Loadout foundLoadout = dbContext.Loadouts.Where(l => l.LoadoutName == loadoutName && l.DiscordId == discordId && l.DestinyCharacterId == destinyCharacterId).AsQueryable().FirstOrDefault();
                    Assert.AreEqual(loadout.DestinyCharacterId, foundLoadout.DestinyCharacterId);
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    LoadoutDao loadoutDao = new LoadoutDao(dbContext);
                    loadoutDao.AddOrUpdateLoadout(loadout2);
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    Assert.AreEqual(2, dbContext.Loadouts.Count());
                    Loadout foundLoadout = dbContext.Loadouts.Where(l => l.LoadoutName == loadoutName && l.DiscordId == discordId && l.DestinyCharacterId == 69).AsQueryable().FirstOrDefault();
                    Assert.AreEqual(69, foundLoadout.DestinyCharacterId);
                }
            }
        }
 public void GetAllLoadoutsForUser_NoLoadouts_ShouldReturnEmptyList()
 {
     using (SqliteConnection connection = new SqliteConnection("DataSource=:memory:")) {
         connection.Open();
         DbContextOptions <EmissaryDbContext> options = new DbContextOptionsBuilder <EmissaryDbContext>()
                                                        .UseSqlite(connection)
                                                        .Options;
         using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
             dbContext.Database.EnsureCreated();
         }
         using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
             LoadoutDao      loadoutDao = new LoadoutDao(dbContext);
             IList <Loadout> loadouts   = loadoutDao.GetAllLoadoutsForUser(69);
             Assert.AreEqual(0, loadouts.Count);
         }
     }
 }
 public void GetLoadout_UserHasNoLoadouts_ShouldReturnNull()
 {
     using (SqliteConnection connection = new SqliteConnection("DataSource=:memory:")) {
         connection.Open();
         DbContextOptions <EmissaryDbContext> options = new DbContextOptionsBuilder <EmissaryDbContext>()
                                                        .UseSqlite(connection)
                                                        .Options;
         using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
             dbContext.Database.EnsureCreated();
         }
         using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
             LoadoutDao loadoutDao   = new LoadoutDao(dbContext);
             Loadout    foundLoadout = loadoutDao.GetLoadout(69, 420, "crucible");
             Assert.IsNull(foundLoadout);
         }
     }
 }
        public void AddOrUpdateLoadout_LoadoutAlreadyExistsUpdateItWithNewValue_ShouldWriteToDatabase()
        {
            ulong       discordId          = 221313820847636491;
            long        destinyCharacterId = 2305843009504575107;
            uint        izanagiHash        = 3211806999;
            long        izanagiInstanceId  = 6917529135183883487;
            string      loadoutName        = "crucible";
            DestinyItem izanagiItem        = new DestinyItem(izanagiInstanceId, "Izanagi's Burden", new List <string>()
            {
                "Weapon", "Kinetic Weapon", "Sniper Rifle"
            }, izanagiHash, new List <uint>()
            {
                2, 1, 10
            }, "Exotic");
            Loadout loadout = new Loadout(discordId, destinyCharacterId, loadoutName, new List <DestinyItem>()
            {
                izanagiItem
            });

            using (SqliteConnection connection = new SqliteConnection("DataSource=:memory:")) {
                connection.Open();
                DbContextOptions <EmissaryDbContext> options = new DbContextOptionsBuilder <EmissaryDbContext>()
                                                               .UseSqlite(connection)
                                                               .Options;
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    dbContext.Database.EnsureCreated();
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    LoadoutDao loadoutDao = new LoadoutDao(dbContext);
                    loadoutDao.AddOrUpdateLoadout(loadout);
                    Assert.AreEqual(1, dbContext.Loadouts.Count());
                }
                // now let's update the loadout contents and assert again
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    LoadoutDao loadoutDao = new LoadoutDao(dbContext);
                    loadout.Items.Remove(loadout.Items.Single(item => item.Name == "Izanagi's Burden"));
                    loadoutDao.AddOrUpdateLoadout(loadout);
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    Assert.AreEqual(1, dbContext.Loadouts.Count());
                    Loadout foundLoadout = dbContext.Loadouts.Where(l => l.LoadoutName == loadoutName && l.DiscordId == discordId).AsQueryable().FirstOrDefault();
                    Assert.AreEqual(0, foundLoadout.Items.Count);
                }
            }
        }
 public void RemoveLoadout_LoadoutDoesNotExist_ShouldDoNothing()
 {
     using (SqliteConnection connection = new SqliteConnection("DataSource=:memory:")) {
         connection.Open();
         DbContextOptions <EmissaryDbContext> options = new DbContextOptionsBuilder <EmissaryDbContext>()
                                                        .UseSqlite(connection)
                                                        .Options;
         using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
             dbContext.Database.EnsureCreated();
         }
         using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
             LoadoutDao loadoutDao = new LoadoutDao(dbContext);
             Assert.AreEqual(0, dbContext.Loadouts.Count());
             loadoutDao.RemoveLoadout(69, 420, "crucible");
             Assert.AreEqual(0, dbContext.Loadouts.Count());
         }
     }
 }
        public void RemoveLoadout_LoadoutDoesExist_ShouldRemoveAndUpdateDatabase()
        {
            ulong discordId        = 221313820847636491;
            long  titanCharacterId = 2305843009504575107;

            uint        izanagiHash       = 3211806999;
            long        izanagiInstanceId = 6917529135183883487;
            DestinyItem izanagiItem       = new DestinyItem(izanagiInstanceId, "Izanagi's Burden",
                                                            new List <string>()
            {
                "Weapon", "Kinetic Weapon", "Sniper Rifle"
            }, izanagiHash,
                                                            new List <uint>()
            {
                2, 1, 10
            }, "Exotic");
            Loadout titanLoadout = new Loadout(discordId, titanCharacterId, "raid",
                                               new List <DestinyItem>()
            {
                izanagiItem
            });

            using (SqliteConnection connection = new SqliteConnection("DataSource=:memory:")) {
                connection.Open();
                DbContextOptions <EmissaryDbContext> options = new DbContextOptionsBuilder <EmissaryDbContext>()
                                                               .UseSqlite(connection)
                                                               .Options;
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    dbContext.Database.EnsureCreated();
                    dbContext.Loadouts.Add(titanLoadout);
                    dbContext.SaveChanges();
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    LoadoutDao loadoutDao = new LoadoutDao(dbContext);
                    Assert.AreEqual(1, dbContext.Loadouts.Count());
                    loadoutDao.RemoveLoadout(discordId, titanCharacterId, "raid");
                    Assert.AreEqual(0, dbContext.Loadouts.Count());
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    Assert.AreEqual(0, dbContext.Loadouts.Count());
                }
            }
        }
 public void Dispose_NormalUseCase_LoadoutDaoObjectShouldBeSuccessfullyDisposed()
 {
     using (SqliteConnection connection = new SqliteConnection("DataSource=:memory:")) {
         connection.Open();
         DbContextOptions <EmissaryDbContext> options = new DbContextOptionsBuilder <EmissaryDbContext>()
                                                        .UseSqlite(connection)
                                                        .Options;
         using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
             dbContext.Database.EnsureCreated();
         }
         using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
             using (LoadoutDao loadoutDao = new LoadoutDao(dbContext)) {
                 loadoutDao.GetAllLoadoutsForUser(69);
             }
             using (LoadoutDao loadoutDao = new LoadoutDao(dbContext)) {
                 IDisposable disposable = loadoutDao as IDisposable;
                 disposable.Dispose();
             }
         }
     }
 }
        public void GetAllLoadoutsForUser_MultipleLoadoutsOnMultipleCharacters_ShouldReturnLoadoutsForAllCharacters()
        {
            ulong discordId = 221313820847636491;

            long        titanCharacterId  = 2305843009504575107;
            uint        izanagiHash       = 3211806999;
            long        izanagiInstanceId = 6917529135183883487;
            DestinyItem izanagiItem       = new DestinyItem(izanagiInstanceId, "Izanagi's Burden",
                                                            new List <string>()
            {
                "Kinetic Weapon", "Weapon", "Sniper Rifle"
            }, izanagiHash,
                                                            new List <uint>()
            {
                2, 1, 10
            }, "Exotic");
            uint        suddenDeathHash       = 1879212552;
            long        suddenDeathInstanceId = 6917529043814140192;
            DestinyItem suddenDeathItem       = new DestinyItem(suddenDeathInstanceId, "A Sudden Death",
                                                                new List <string>()
            {
                "Energy Weapon", "Weapon", "Shotgun"
            }, suddenDeathHash,
                                                                new List <uint>()
            {
                3, 1, 11
            }, "Legendary");

            Loadout titanLoadout = new Loadout(discordId, titanCharacterId, "raid",
                                               new List <DestinyItem>()
            {
                izanagiItem
            });
            Loadout titanLoadout2 = new Loadout(discordId, titanCharacterId, "raid2", new List <DestinyItem>()
            {
                suddenDeathItem
            });
            Loadout titanLoadout3 = new Loadout(discordId, titanCharacterId, "raid3", new List <DestinyItem>()
            {
                izanagiItem, suddenDeathItem
            });
            Loadout warlockLoadout = new Loadout(discordId, 69, "raid", new List <DestinyItem>()
            {
                izanagiItem
            });
            Loadout hunterLoadout = new Loadout(discordId, 420, "raid", new List <DestinyItem>()
            {
                izanagiItem
            });

            IList <Loadout> allLoadoutsForUser = new List <Loadout>()
            {
                titanLoadout, titanLoadout2, titanLoadout3, warlockLoadout, hunterLoadout
            };

            using (SqliteConnection connection = new SqliteConnection("DataSource=:memory:")) {
                connection.Open();
                DbContextOptions <EmissaryDbContext> options = new DbContextOptionsBuilder <EmissaryDbContext>()
                                                               .UseSqlite(connection)
                                                               .Options;
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    dbContext.Database.EnsureCreated();
                    dbContext.Loadouts.Add(titanLoadout);
                    dbContext.Loadouts.Add(titanLoadout2);
                    dbContext.Loadouts.Add(titanLoadout3);
                    dbContext.Loadouts.Add(warlockLoadout);
                    dbContext.Loadouts.Add(hunterLoadout);
                    dbContext.SaveChanges();
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    LoadoutDao      loadoutDao      = new LoadoutDao(dbContext);
                    IList <Loadout> loadoutsForUser = loadoutDao.GetAllLoadoutsForUser(discordId);
                    Assert.AreEqual(5, loadoutsForUser.Count);
                }
            }
        }
        public void GetLoadout_LoadoutExistsAndThenLoadoutValueIsChanged_ShouldReturnLoadoutThenUpdatedLoadout()
        {
            ulong discordId        = 221313820847636491;
            long  titanCharacterId = 2305843009504575107;

            uint        izanagiHash       = 3211806999;
            long        izanagiInstanceId = 6917529135183883487;
            DestinyItem izanagiItem       = new DestinyItem(izanagiInstanceId, "Izanagi's Burden",
                                                            new List <string>()
            {
                "Weapon", "Kinetic Weapon", "Sniper Rifle"
            }, izanagiHash,
                                                            new List <uint>()
            {
                2, 1, 10
            }, "Exotic");
            Loadout titanLoadout = new Loadout(discordId, titanCharacterId, "raid",
                                               new List <DestinyItem>()
            {
                izanagiItem
            });

            uint        suddenDeathHash       = 1879212552;
            long        suddenDeathInstanceId = 6917529043814140192;
            DestinyItem suddenDeathItem       = new DestinyItem(suddenDeathInstanceId, "A Sudden Death",
                                                                new List <string>()
            {
                "Energy Weapon", "Weapon", "Shotgun"
            }, suddenDeathHash,
                                                                new List <uint>()
            {
                3, 1, 11
            }, "Exotic");

            using (SqliteConnection connection = new SqliteConnection("DataSource=:memory:")) {
                connection.Open();
                DbContextOptions <EmissaryDbContext> options = new DbContextOptionsBuilder <EmissaryDbContext>()
                                                               .UseSqlite(connection)
                                                               .Options;
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    dbContext.Database.EnsureCreated();
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    LoadoutDao loadoutDao = new LoadoutDao(dbContext);
                    dbContext.Loadouts.Add(titanLoadout);
                    dbContext.SaveChanges();
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    LoadoutDao loadoutDao = new LoadoutDao(dbContext);
                    Assert.AreEqual(1, dbContext.Loadouts.Count());
                    Loadout foundLoadout = loadoutDao.GetLoadout(discordId, titanCharacterId, "raid");
                    Assert.AreEqual(1, foundLoadout.Items.Count);
                    Assert.AreEqual(izanagiInstanceId, foundLoadout.Items[0].ItemInstanceId);
                    titanLoadout.Items.Add(suddenDeathItem);
                    loadoutDao.AddOrUpdateLoadout(titanLoadout);
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    LoadoutDao loadoutDao = new LoadoutDao(dbContext);
                    Assert.AreEqual(1, dbContext.Loadouts.Count());
                    Loadout foundLoadout = loadoutDao.GetLoadout(discordId, titanCharacterId, "raid");
                    Assert.AreEqual(2, foundLoadout.Items.Count);
                    Assert.AreEqual(izanagiInstanceId, foundLoadout.Items[0].ItemInstanceId);
                    Assert.AreEqual(suddenDeathInstanceId, foundLoadout.Items[1].ItemInstanceId);
                }
            }
        }