|
| 1 | +import { readFileSync } from "fs"; |
| 2 | +import { join } from "path"; |
1 | 3 | import { Logger } from "@nestjs/common"; |
2 | 4 | import { PostgresService } from "./../src/postgres/postgres.service"; |
3 | 5 | import { MapAssetsService } from "./../src/map-assets/map-assets.service"; |
@@ -206,6 +208,89 @@ describe("map asset builds (SQL-driven)", () => { |
206 | 208 | expect(queue.add).not.toHaveBeenCalled(); |
207 | 209 | }); |
208 | 210 |
|
| 211 | + it("builds every seeded map, and any other only while some mode enables it", async () => { |
| 212 | + await postgres.query( |
| 213 | + `INSERT INTO maps (name, type, enabled, active_pool, workshop_map_id, deleted_at, seeded) |
| 214 | + VALUES ('de_assets_playable', 'Competitive', true, false, NULL, NULL, false), |
| 215 | + ('de_assets_one_mode', 'Competitive', false, false, '9101', NULL, true), |
| 216 | + ('de_assets_one_mode', 'Duel', true, false, '9100', NULL, true), |
| 217 | + ('9200', 'Competitive', false, false, '9200', NULL, false), |
| 218 | + ('de_assets_deleted', 'Competitive', true, false, '9300', now(), false)`, |
| 219 | + ); |
| 220 | + await postgres.query( |
| 221 | + `UPDATE maps SET enabled = false WHERE name = 'cs_office'`, |
| 222 | + ); |
| 223 | + const mapAssets = service(); |
| 224 | + |
| 225 | + try { |
| 226 | + await (mapAssets as any).startJob("node-a", "25537370", false); |
| 227 | + } finally { |
| 228 | + await postgres.query( |
| 229 | + `DELETE FROM maps WHERE name IN ('de_assets_playable', 'de_assets_one_mode', '9200', 'de_assets_deleted')`, |
| 230 | + ); |
| 231 | + await postgres.query( |
| 232 | + `UPDATE maps SET enabled = true WHERE name = 'cs_office'`, |
| 233 | + ); |
| 234 | + } |
| 235 | + |
| 236 | + const [[{ body }]] = (mapAssets as any).batchApi.createNamespacedJob.mock |
| 237 | + .calls; |
| 238 | + const args: Array<string> = body.spec.template.spec.containers[0].args; |
| 239 | + const only = args[args.indexOf("--only-maps") + 1].split(","); |
| 240 | + const workshop = args[args.indexOf("--workshop-maps") + 1].split(","); |
| 241 | + expect(only).toEqual( |
| 242 | + expect.arrayContaining([ |
| 243 | + "cs_office", |
| 244 | + "de_assets_playable", |
| 245 | + "de_assets_one_mode", |
| 246 | + ]), |
| 247 | + ); |
| 248 | + expect(only).not.toContain("9200"); |
| 249 | + expect(only).not.toContain("de_assets_deleted"); |
| 250 | + expect(workshop).toContain("de_assets_one_mode=9100"); |
| 251 | + expect(workshop).not.toContain("de_assets_one_mode=9101"); |
| 252 | + expect(workshop).not.toContain("9200=9200"); |
| 253 | + expect(workshop).not.toContain("de_assets_deleted=9300"); |
| 254 | + }); |
| 255 | + |
| 256 | + it("marks every mode of the maps the seed ships, and only those", async () => { |
| 257 | + // As the migration leaves every existing row on upgrade. |
| 258 | + await postgres.query(`UPDATE maps SET seeded = false`); |
| 259 | + await postgres.query( |
| 260 | + `INSERT INTO maps (name, type, active_pool, seeded) |
| 261 | + VALUES ('de_mirage', 'Duel', false, false), |
| 262 | + ('de_assets_retired', 'Competitive', false, true), |
| 263 | + ('de_assets_custom', 'Competitive', false, false)`, |
| 264 | + ); |
| 265 | + |
| 266 | + try { |
| 267 | + await postgres.query( |
| 268 | + readFileSync(join(__dirname, "../hasura/enums/maps.sql"), "utf8"), |
| 269 | + ); |
| 270 | + const seeded = await postgres.query< |
| 271 | + Array<{ name: string; type: string; seeded: boolean }> |
| 272 | + >( |
| 273 | + `SELECT name, type, seeded FROM maps |
| 274 | + WHERE (name = 'de_mirage' AND type IN ('Competitive', 'Duel')) |
| 275 | + OR name IN ('cs_office', 'de_assets_retired', 'de_assets_custom') |
| 276 | + ORDER BY name, type`, |
| 277 | + ); |
| 278 | + expect(seeded).toEqual([ |
| 279 | + { name: "cs_office", type: "Competitive", seeded: true }, |
| 280 | + { name: "de_assets_custom", type: "Competitive", seeded: false }, |
| 281 | + { name: "de_assets_retired", type: "Competitive", seeded: false }, |
| 282 | + { name: "de_mirage", type: "Competitive", seeded: true }, |
| 283 | + { name: "de_mirage", type: "Duel", seeded: true }, |
| 284 | + ]); |
| 285 | + } finally { |
| 286 | + await postgres.query( |
| 287 | + `DELETE FROM maps |
| 288 | + WHERE (name = 'de_mirage' AND type = 'Duel') |
| 289 | + OR name IN ('de_assets_retired', 'de_assets_custom')`, |
| 290 | + ); |
| 291 | + } |
| 292 | + }); |
| 293 | + |
209 | 294 | it("records a published build and the manifest revision it came from", async () => { |
210 | 295 | const maps = { de_mirage: { tri: "25000000/de_mirage.tri.gz" } }; |
211 | 296 | await postgres.query( |
|
0 commit comments