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); }