S3ClientMock.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /* eslint-disable new-cap */
  2. const sinon = require('sinon')
  3. const chai = require('chai')
  4. const { expect, assert } = chai
  5. module.exports = function () {
  6. const s3ClientStub = {
  7. send: sinon.stub(),
  8. middlewareStack: new Set(),
  9. }
  10. const assertSendCalledWith = (s3Command, payload) => {
  11. for (let i = 0; i < s3ClientStub.send.callCount; i++) {
  12. const call = s3ClientStub.send.getCall(i)
  13. const callArg = call.args[0]
  14. if (callArg?.name === new s3Command().name) {
  15. if (payload) {
  16. expect(callArg.payload).to.deep.equal(payload)
  17. }
  18. return
  19. }
  20. }
  21. assert.fail(
  22. `Expected S3Client to be called with '${new s3Command().name}' command but it was not called`
  23. )
  24. }
  25. const assertSendCallCount = (s3Command, expectedCount) => {
  26. const callCount = s3ClientStub.send.callCount
  27. let counter = 0
  28. for (let i = 0; i < callCount; i++) {
  29. const call = s3ClientStub.send.getCall(i)
  30. const callArg = call.args[0]
  31. if (callArg?.name === new s3Command().name) {
  32. counter++
  33. }
  34. }
  35. expect(counter).to.equal(expectedCount)
  36. }
  37. const assertSendNotCalledWith = s3Command => {
  38. for (let i = 0; i < s3ClientStub.send.callCount; i++) {
  39. const call = s3ClientStub.send.getCall(i)
  40. const callArg = call.args[0]
  41. if (callArg?.name === new s3Command().name) {
  42. assert.fail(
  43. `Expected S3Client not to be called with '${new s3Command().name}' command but it was called`
  44. )
  45. }
  46. }
  47. }
  48. const mockSend = (s3Command, response, options = {}) => {
  49. const mock = s3ClientStub.send.withArgs(sinon.match.instanceOf(s3Command))
  50. const fn = options.rejects ? 'rejects' : 'resolves'
  51. if (options.nextResponses?.length) {
  52. mock.onCall(0)[fn](response)
  53. for (let i = 0; i < options.nextResponses.length; i++) {
  54. mock.onCall(i + 1)[fn](options.nextResponses[i])
  55. }
  56. } else {
  57. mock[fn](response)
  58. }
  59. }
  60. return {
  61. s3ClientStub,
  62. assertSendCalledWith,
  63. assertSendCallCount,
  64. assertSendNotCalledWith,
  65. mockSend,
  66. S3Client: sinon.stub().returns(s3ClientStub),
  67. CopyObjectCommand: class DeleteObjectCommand {
  68. constructor(payload) {
  69. this.name = 'CopyObjectCommand'
  70. this.payload = payload
  71. }
  72. },
  73. DeleteObjectCommand: class DeleteObjectCommand {
  74. constructor(payload) {
  75. this.name = 'DeleteObjectCommand'
  76. this.payload = payload
  77. }
  78. },
  79. DeleteObjectsCommand: class DeleteObjectCommand {
  80. constructor(payload) {
  81. this.name = 'DeleteObjectsCommand'
  82. this.payload = payload
  83. }
  84. },
  85. GetObjectCommand: class DeleteObjectCommand {
  86. constructor(payload) {
  87. this.name = 'GetObjectCommand'
  88. this.payload = payload
  89. }
  90. },
  91. HeadObjectCommand: class DeleteObjectCommand {
  92. constructor(payload) {
  93. this.name = 'HeadObjectCommand'
  94. this.payload = payload
  95. }
  96. },
  97. ListObjectsV2Command: class DeleteObjectCommand {
  98. constructor(payload) {
  99. this.name = 'ListObjectsV2Command'
  100. this.payload = payload
  101. }
  102. },
  103. }
  104. }