ServerDbSqliteTests.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using Content.Server.Database;
  4. using Content.Shared.GameTicking;
  5. using Content.Shared.Humanoid;
  6. using Content.Shared.Preferences;
  7. using Content.Shared.Preferences.Loadouts;
  8. using Content.Shared.Preferences.Loadouts.Effects;
  9. using Microsoft.Data.Sqlite;
  10. using Microsoft.EntityFrameworkCore;
  11. using Robust.Shared.Configuration;
  12. using Robust.Shared.Enums;
  13. using Robust.Shared.Log;
  14. using Robust.Shared.Maths;
  15. using Robust.Shared.Network;
  16. using Robust.UnitTesting;
  17. namespace Content.IntegrationTests.Tests.Preferences
  18. {
  19. [TestFixture]
  20. public sealed class ServerDbSqliteTests
  21. {
  22. [TestPrototypes]
  23. private const string Prototypes = @"
  24. - type: dataset
  25. id: sqlite_test_names_first_male
  26. values:
  27. - Aaden
  28. - type: dataset
  29. id: sqlite_test_names_first_female
  30. values:
  31. - Aaliyah
  32. - type: dataset
  33. id: sqlite_test_names_last
  34. values:
  35. - Ackerley";
  36. private static HumanoidCharacterProfile CharlieCharlieson()
  37. {
  38. return new()
  39. {
  40. Name = "Charlie Charlieson",
  41. FlavorText = "The biggest boy around.",
  42. Species = "Human",
  43. Age = 21,
  44. Appearance = new(
  45. "Afro",
  46. Color.Aqua,
  47. "Shaved",
  48. Color.Aquamarine,
  49. Color.Azure,
  50. Color.Beige,
  51. new ())
  52. };
  53. }
  54. private static ServerDbSqlite GetDb(RobustIntegrationTest.ServerIntegrationInstance server)
  55. {
  56. var cfg = server.ResolveDependency<IConfigurationManager>();
  57. var opsLog = server.ResolveDependency<ILogManager>().GetSawmill("db.ops");
  58. var builder = new DbContextOptionsBuilder<SqliteServerDbContext>();
  59. var conn = new SqliteConnection("Data Source=:memory:");
  60. conn.Open();
  61. builder.UseSqlite(conn);
  62. return new ServerDbSqlite(() => builder.Options, true, cfg, true, opsLog);
  63. }
  64. [Test]
  65. public async Task TestUserDoesNotExist()
  66. {
  67. var pair = await PoolManager.GetServerClient();
  68. var db = GetDb(pair.Server);
  69. // Database should be empty so a new GUID should do it.
  70. Assert.That(await db.GetPlayerPreferencesAsync(NewUserId()), Is.Null);
  71. await pair.CleanReturnAsync();
  72. }
  73. [Test]
  74. public async Task TestInitPrefs()
  75. {
  76. var pair = await PoolManager.GetServerClient();
  77. var db = GetDb(pair.Server);
  78. var username = new NetUserId(new Guid("640bd619-fc8d-4fe2-bf3c-4a5fb17d6ddd"));
  79. const int slot = 0;
  80. var originalProfile = CharlieCharlieson();
  81. await db.InitPrefsAsync(username, originalProfile);
  82. var prefs = await db.GetPlayerPreferencesAsync(username);
  83. Assert.That(prefs.Characters.Single(p => p.Key == slot).Value.MemberwiseEquals(originalProfile));
  84. await pair.CleanReturnAsync();
  85. }
  86. [Test]
  87. public async Task TestDeleteCharacter()
  88. {
  89. var pair = await PoolManager.GetServerClient();
  90. var server = pair.Server;
  91. var db = GetDb(server);
  92. var username = new NetUserId(new Guid("640bd619-fc8d-4fe2-bf3c-4a5fb17d6ddd"));
  93. await db.InitPrefsAsync(username, new HumanoidCharacterProfile());
  94. await db.SaveCharacterSlotAsync(username, CharlieCharlieson(), 1);
  95. await db.SaveSelectedCharacterIndexAsync(username, 1);
  96. await db.SaveCharacterSlotAsync(username, null, 1);
  97. var prefs = await db.GetPlayerPreferencesAsync(username);
  98. Assert.That(!prefs.Characters.Any(p => p.Key != 0));
  99. await pair.CleanReturnAsync();
  100. }
  101. [Test]
  102. public async Task TestNoPendingDatabaseChanges()
  103. {
  104. var pair = await PoolManager.GetServerClient();
  105. var server = pair.Server;
  106. var db = GetDb(server);
  107. Assert.That(async () => await db.HasPendingModelChanges(), Is.False,
  108. "The database has pending model changes. Add a new migration to apply them. See https://learn.microsoft.com/en-us/ef/core/managing-schemas/migrations");
  109. await pair.CleanReturnAsync();
  110. }
  111. private static NetUserId NewUserId()
  112. {
  113. return new(Guid.NewGuid());
  114. }
  115. }
  116. }