MigrateUserFeatureTimeoutTests.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. const { expect } = require('chai')
  2. const { promisify } = require('node:util')
  3. const { exec } = require('node:child_process')
  4. const logger = require('@overleaf/logger')
  5. const { db } = require('../../../app/src/infrastructure/mongodb')
  6. async function runScript(args = []) {
  7. try {
  8. return await promisify(exec)(
  9. ['node', 'scripts/migration_compile_timeout_60s_to_20s.js', ...args].join(
  10. ' '
  11. )
  12. )
  13. } catch (error) {
  14. logger.error({ error }, 'script failed')
  15. throw error
  16. }
  17. }
  18. describe('MigrateUserFeatureTimeoutTests', function () {
  19. const usersInput = {
  20. noFeatures: {},
  21. noFeatureTimeout: { features: {} },
  22. timeout10s: { features: { compileTimeout: 10, other: 'val1' }, bar: '1' },
  23. timeout20s: { features: { compileTimeout: 20, other: 'val2' }, bar: '2' },
  24. timeout30s: { features: { compileTimeout: 30, other: 'val3' }, bar: '3' },
  25. timeout60s: { features: { compileTimeout: 60, other: 'val4' }, bar: '4' },
  26. timeout120s: { features: { compileTimeout: 120, other: 'val5' }, bar: '5' },
  27. timeout180s: { features: { compileTimeout: 180, other: 'val6' }, bar: '6' },
  28. }
  29. const usersKeys = Object.keys(usersInput)
  30. const userIds = {}
  31. beforeEach('insert users', async function () {
  32. const usersInsertedValues = await db.users.insertMany(
  33. usersKeys.map(key => ({
  34. ...usersInput[key],
  35. email: `${key}@example.com`,
  36. }))
  37. )
  38. usersKeys.forEach(
  39. (key, index) => (userIds[key] = usersInsertedValues.insertedIds[index])
  40. )
  41. })
  42. it('gives correct counts in dry mode', async function () {
  43. const users = await db.users.find().toArray()
  44. expect(users).to.have.lengthOf(usersKeys.length)
  45. const result = await runScript([])
  46. expect(result.stderr).to.contain(
  47. 'Doing dry run. Add --commit to commit changes'
  48. )
  49. expect(result.stdout).to.contain(
  50. 'Found 3 users with compileTimeout <= 60s && != 20s'
  51. )
  52. expect(result.stdout).to.contain('Found 1 users with compileTimeout == 20s')
  53. expect(result.stdout).not.to.contain('Updated')
  54. const usersAfter = await db.users.find().toArray()
  55. expect(usersAfter).to.deep.equal(users)
  56. })
  57. it("updates users compileTimeout when '--commit' is set", async function () {
  58. const users = await db.users.find().toArray()
  59. expect(users).to.have.lengthOf(usersKeys.length)
  60. const result = await runScript(['--commit'])
  61. expect(result.stdout).to.contain(
  62. 'Found 3 users with compileTimeout <= 60s && != 20s'
  63. )
  64. expect(result.stdout).to.contain('Found 1 users with compileTimeout == 20s')
  65. expect(result.stdout).to.contain('Updated 3 records')
  66. const usersAfter = await db.users.find().toArray()
  67. expect(usersAfter).to.deep.equal([
  68. { _id: userIds.noFeatures, email: 'noFeatures@example.com' },
  69. {
  70. _id: userIds.noFeatureTimeout,
  71. email: 'noFeatureTimeout@example.com',
  72. features: {},
  73. },
  74. {
  75. _id: userIds.timeout10s,
  76. email: 'timeout10s@example.com',
  77. features: { compileTimeout: 20, other: 'val1' },
  78. bar: '1',
  79. },
  80. {
  81. _id: userIds.timeout20s,
  82. email: 'timeout20s@example.com',
  83. features: { compileTimeout: 20, other: 'val2' },
  84. bar: '2',
  85. },
  86. {
  87. _id: userIds.timeout30s,
  88. email: 'timeout30s@example.com',
  89. features: { compileTimeout: 20, other: 'val3' },
  90. bar: '3',
  91. },
  92. {
  93. _id: userIds.timeout60s,
  94. email: 'timeout60s@example.com',
  95. features: { compileTimeout: 20, other: 'val4' },
  96. bar: '4',
  97. },
  98. {
  99. _id: userIds.timeout120s,
  100. email: 'timeout120s@example.com',
  101. features: { compileTimeout: 120, other: 'val5' },
  102. bar: '5',
  103. },
  104. {
  105. _id: userIds.timeout180s,
  106. email: 'timeout180s@example.com',
  107. features: { compileTimeout: 180, other: 'val6' },
  108. bar: '6',
  109. },
  110. ])
  111. const result2 = await runScript([])
  112. expect(result2.stdout).to.contain(
  113. 'Found 0 users with compileTimeout <= 60s && != 20s'
  114. )
  115. expect(result2.stdout).to.contain(
  116. 'Found 4 users with compileTimeout == 20s'
  117. )
  118. })
  119. })