async-spec-helpers.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /** @babel */
  2. export function beforeEach (fn) {
  3. global.beforeEach(function () {
  4. const result = fn()
  5. if (result instanceof Promise) {
  6. waitsForPromise(() => result)
  7. }
  8. })
  9. }
  10. export function afterEach (fn) {
  11. global.afterEach(function () {
  12. const result = fn()
  13. if (result instanceof Promise) {
  14. waitsForPromise(() => result)
  15. }
  16. })
  17. }
  18. ['it', 'fit', 'ffit', 'fffit'].forEach(function (name) {
  19. module.exports[name] = function (description, fn) {
  20. if (fn === undefined) {
  21. global[name](description)
  22. return
  23. }
  24. global[name](description, function () {
  25. const result = fn()
  26. if (result instanceof Promise) {
  27. waitsForPromise(() => result)
  28. }
  29. })
  30. }
  31. })
  32. export async function conditionPromise (condition) {
  33. const startTime = Date.now()
  34. while (true) {
  35. await timeoutPromise(100)
  36. if (await condition()) {
  37. return
  38. }
  39. if (Date.now() - startTime > 5000) {
  40. throw new Error('Timed out waiting on condition')
  41. }
  42. }
  43. }
  44. export function timeoutPromise (timeout) {
  45. return new Promise(function (resolve) {
  46. global.setTimeout(resolve, timeout)
  47. })
  48. }
  49. function waitsForPromise (fn) {
  50. const promise = fn()
  51. global.waitsFor('spec promise to resolve', function (done) {
  52. promise.then(done, function (error) {
  53. jasmine.getEnv().currentSpec.fail(error)
  54. done()
  55. })
  56. })
  57. }
  58. export function emitterEventPromise (emitter, event, timeout = 15000) {
  59. return new Promise((resolve, reject) => {
  60. const timeoutHandle = setTimeout(() => {
  61. reject(new Error(`Timed out waiting for '${event}' event`))
  62. }, timeout)
  63. emitter.once(event, () => {
  64. clearTimeout(timeoutHandle)
  65. resolve()
  66. })
  67. })
  68. }
  69. export function promisify (original) {
  70. return function (...args) {
  71. return new Promise((resolve, reject) => {
  72. args.push((err, ...results) => {
  73. if (err) {
  74. reject(err)
  75. } else {
  76. resolve(...results)
  77. }
  78. })
  79. return original(...args)
  80. })
  81. }
  82. }
  83. export function promisifySome (obj, fnNames) {
  84. const result = {}
  85. for (const fnName of fnNames) {
  86. result[fnName] = promisify(obj[fnName])
  87. }
  88. return result
  89. }