public void ReturnsLeaderboardsStoreClient()
            {
                // Arrange
                var connectionString = StorageHelper.GetDatabaseConnectionString(nameof(NecroDancerContext));

                // Act
                var storeClient = new LeaderboardsStoreClient(connectionString);

                // Assert
                Assert.IsAssignableFrom <LeaderboardsStoreClient>(storeClient);
            }
            public void ExIsNotSqlCommandException_ReturnsFalse()
            {
                // Arrange
                var ex = new Exception();

                // Act
                var isTransient = LeaderboardsStoreClient.IsTransient(ex);

                // Assert
                Assert.False(isTransient);
            }
            public void ExIsSqlCommandExceptionAndDoesNotContainSqlErrorWithNumberIs2_ReturnsFalse()
            {
                // Arrange
                var sqlError     = SqlClientUtil.CreateSqlError(0);
                var sqlException = SqlClientUtil.CreateSqlException(sqlError);
                var ex           = new SqlCommandException(null, sqlException, null);

                // Act
                var isTransient = LeaderboardsStoreClient.IsTransient(ex);

                // Assert
                Assert.False(isTransient);
            }
        public static async Task <IEnumerable <DailyLeaderboard> > GetDailyLeaderboardsAsync(ISteamClientApiClient steamClient)
        {
            var expectedDailyLeaderboards = new DailyLeaderboardsEnumerable(DateTime.UtcNow.Date);

            var missingDaily = expectedDailyLeaderboards.First(d => d.Date == new DateTime(2017, 10, 3, 0, 0, 0, DateTimeKind.Utc));

            // Add leaderboards found in local cache.
            // This does not perform updates since the local cache may contain bad data due to bugs from previous builds.
            var cachedDailyLeaderboards = JsonConvert.DeserializeObject <IEnumerable <DailyLeaderboard> >(Resources.DailyLeaderboards);
            var connectionString        = ConfigurationManager.ConnectionStrings[nameof(LeaderboardsContext)].ConnectionString;

            using (var storeClient = new LeaderboardsStoreClient(connectionString))
            {
                var options = new BulkUpsertOptions {
                    UpdateWhenMatched = false
                };
                await storeClient.BulkUpsertAsync(cachedDailyLeaderboards, options, default).ConfigureAwait(false);
            }

            using (var db = new LeaderboardsContext())
            {
                // Exclude existing daily leaderboards
                var dailyLeaderboards        = db.DailyLeaderboards.ToList();
                var missingDailyLeaderboards = expectedDailyLeaderboards.Except(dailyLeaderboards, new DailyLeaderboardEqualityComparer()).ToList();

                if (missingDailyLeaderboards.Any())
                {
                    // Get the leaderboard IDs for the missing leaderboards
                    await UpdateDailyLeaderboardsAsync(steamClient, missingDailyLeaderboards).ConfigureAwait(false);

                    // Store the new leaderboards
                    foreach (var dailyLeaderboard in missingDailyLeaderboards)
                    {
                        if (dailyLeaderboard.LeaderboardId == 0)
                        {
                            continue;
                        }

                        db.DailyLeaderboards.Add(dailyLeaderboard);
                    }

                    db.SaveChanges();
                }

                return((from l in db.DailyLeaderboards
                        orderby l.Date, l.ProductId, l.IsProduction
                        select l)
                       .ToList());
            }
        }
        public IntegrationTestsBase()
        {
            var connectionString = StorageHelper.GetDatabaseConnectionString(Constants.LeaderboardsStoreClientName);
            var options          = new DbContextOptionsBuilder <NecroDancerContext>()
                                   .UseSqlServer(connectionString)
                                   .Options;

            db = new NecroDancerContext(options);

            db.Database.EnsureDeleted();
            db.Database.Migrate();
            db.EnsureSeedData();

            storeClient = new LeaderboardsStoreClient(connectionString);
        }
        private async Task UpdateDailyLeaderboardsAsync(CancellationToken cancellationToken)
        {
            var worker = kernel.Get <DailyLeaderboardsWorker>();

            using (var operation = TelemetryClient.StartOperation <RequestTelemetry>("Update daily leaderboards"))
                using (new UpdateActivity(log, "daily leaderboards"))
                {
                    try
                    {
                        if (!Settings.AreSteamClientCredentialsSet())
                        {
                            log.Warn("Using test data for calls to Steam Client API. Set your Steam user name and password to use the actual Steam Client API.");
                            log.Warn("Run this application with --help to find out how to set your Steam user name and password.");
                        }

                        var leaderboards = await worker.GetDailyLeaderboardsAsync(Settings.DailyLeaderboardsPerUpdate, cancellationToken).ConfigureAwait(false);

                        await worker.UpdateDailyLeaderboardsAsync(leaderboards, cancellationToken).ConfigureAwait(false);

                        await worker.StoreDailyLeaderboardsAsync(leaderboards, cancellationToken).ConfigureAwait(false);

                        operation.Telemetry.Success = true;
                    }
                    catch (Exception ex)
                        when(SteamClientApiClient.IsTransient(ex) ||
                             LeaderboardsStoreClient.IsTransient(ex))
                        {
                            TelemetryClient.TrackException(ex);
                            log.Error("Failed to complete run due to an error.", ex);
                            operation.Telemetry.Success = false;
                        }
                    catch (Exception) when(operation.Telemetry.MarkAsUnsuccessful())
                    {
                    }
                    finally
                    {
                        kernel.Release(worker);
                    }
                }
        }
        public LeaderboardsStoreClientTests()
        {
            var connectionString = StorageHelper.GetDatabaseConnectionString(Constants.LeaderboardsStoreClientName);

            storeClient = new LeaderboardsStoreClient(connectionString);
        }