public void SaveLoadout_CantAccessDatabase_ShouldReturnError()
        {
            IConfiguration        config               = Mock.Of <IConfiguration>();
            IAccessTokenDao       accessTokenDao       = Mock.Of <IAccessTokenDao>();
            IAuthorizationService authorizationService = Mock.Of <IAuthorizationService>();
            Loadout loadoutToSave = new Loadout(69, 420, "crucible", new List <DestinyItem>()
            {
            });

            // using Mode=ReadWrite will fail because it can't create the database.
            // the default is Mode=ReadWriteCreate which creates the database if it doesn't exist.
            using (SqliteConnection connection = new SqliteConnection("DataSource=:memory:")) {
                connection.Open();
                DbContextOptions <EmissaryDbContext> options = new DbContextOptionsBuilder <EmissaryDbContext>()
                                                               .UseSqlite(connection)
                                                               .Options;
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    IBungieApiService bungieApiService = Mock.Of <IBungieApiService>();
                    IManifestDao      manifestDao      = Mock.Of <IManifestDao>();
                    // IEmissaryDao emissaryDao = Mock.Of<IEmissaryDao>();
                    IEmissaryDao emissaryDao = new EmissaryDao(dbContext);
                    // EmissaryDbContext dbContext = Mock.Of<EmissaryDbContext>();
                    // Mock.Get(emissaryDao).Setup(m => m.GetAllLoadoutsForUser(69)).Returns(new List<Loadout>());
                    IEmissary emissary = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService);
                    // connection.Close();
                    // dbContext.Database.CloseConnection();
                    EmissaryResult result = emissary.SaveLoadout(69, loadoutToSave, "crucible");
                    Assert.IsFalse(result.Success);
                    Assert.IsTrue(result.ErrorMessage.Contains("no such table: Loadouts"));
                }
            }
        }
        public void SaveLoadout_OverwriteExistingLoadout_ShouldSucceedAndWriteToDatabase()
        {
            IConfiguration    config           = Mock.Of <IConfiguration>();
            IBungieApiService bungieApiService = Mock.Of <IBungieApiService>();
            IManifestDao      manifestDao      = Mock.Of <IManifestDao>();
            // EmissaryDbContext dbContext = Mock.Of<EmissaryDbContext>();
            // IEmissaryDao emissaryDao = Mock.Of<IEmissaryDao>();
            IAuthorizationService authorizationService = Mock.Of <IAuthorizationService>();

            ulong discordId          = 221313820847636491;
            long  destinyCharacterId = 2305843009504575107;
            // long destinyProfileId = 4611686018467260757;
            // int destinyMembershipType = BungieMembershipType.Steam;
            // EmissaryUser user = new EmissaryUser(discordId, destinyProfileId, destinyMembershipType, "");

            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 loadoutToSave = new Loadout(discordId, destinyCharacterId, "crucible", 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();
                    IList <Loadout> existingLoadoutsForUser = dbContext.Loadouts.Where(l => l.DiscordId == discordId).ToList();
                    Assert.AreEqual(0, existingLoadoutsForUser.Count);
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    IEmissaryDao emissaryDao = new EmissaryDao(dbContext);
                    IEmissary    emissary    = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService);
                    emissary.SaveLoadout(discordId, loadoutToSave, "crucible");
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    IList <Loadout> existingLoadoutsForUser = dbContext.Loadouts.Where(l => l.DiscordId == discordId).ToList();
                    Assert.AreEqual(1, existingLoadoutsForUser.Count);
                    Assert.AreEqual(1, existingLoadoutsForUser[0].Items.Count);
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    IEmissaryDao emissaryDao = new EmissaryDao(dbContext);
                    IEmissary    emissary    = new Emissary(config, bungieApiService, manifestDao, dbContext, emissaryDao, authorizationService);
                    loadoutToSave.Items.Remove(loadoutToSave.Items.Single(item => item.Name == "Izanagi's Burden"));
                    EmissaryResult result = emissary.SaveLoadout(discordId, loadoutToSave, "crucible");
                    Assert.IsTrue(result.Success);
                }
                using (EmissaryDbContext dbContext = new EmissaryDbContext(options)) {
                    IList <Loadout> existingLoadoutsForUser = dbContext.Loadouts.Where(l => l.DiscordId == discordId).ToList();
                    Assert.AreEqual(1, existingLoadoutsForUser.Count);
                    Assert.AreEqual(0, existingLoadoutsForUser[0].Items.Count);
                }
            }
        }