Micro-service for file storage and processing written in Go
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

244 lines
6.2 KiB

  1. package pipelines
  2. import (
  3. "github.com/geplauder/lithium/storage"
  4. "image"
  5. "os"
  6. "path/filepath"
  7. "testing"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. // pipeline deserialization
  11. func TestImagePipelineDeserialization(t *testing.T) {
  12. const Payload string = `{
  13. "name": "example pipeline",
  14. "type": 0,
  15. "removeMetadata": false,
  16. "steps": [
  17. {
  18. "name": "resize image",
  19. "type": 0
  20. },
  21. {
  22. "name": "compress image",
  23. "type": 1
  24. }
  25. ]
  26. }`
  27. t.Run("Image pipeline deserialization is successful", func(t *testing.T) {
  28. values := DeserializePipelines([][]byte{[]byte(Payload)})
  29. assert.Equal(t, 1, len(values), "Output should contain one element")
  30. assert.Equal(t, "example pipeline", values[0].GetName())
  31. assert.Equal(t, Image, values[0].GetType())
  32. })
  33. }
  34. func TestVideoPipelineDeserialization(t *testing.T) {
  35. const Payload string = `{
  36. "name": "example pipeline",
  37. "type": 1,
  38. "removeMetadata": false,
  39. "steps": [
  40. {
  41. "name": "resize image",
  42. "type": 0
  43. },
  44. {
  45. "name": "compress image",
  46. "type": 1
  47. }
  48. ]
  49. }`
  50. t.Run("Video pipelines deserialization is successful", func(t *testing.T) {
  51. values := DeserializePipelines([][]byte{[]byte(Payload)})
  52. assert.Equal(t, 1, len(values), "Output should contain one element")
  53. assert.Equal(t, "example pipeline", values[0].GetName())
  54. assert.Equal(t, Video, values[0].GetType())
  55. })
  56. }
  57. // image pipeline steps
  58. func TestNoSteps(t *testing.T) {
  59. const Payload string = `{
  60. "name": "example pipeline",
  61. "type": 1,
  62. "removeMetadata": false,
  63. "steps": []
  64. }`
  65. const Bucket string = "pipeline_test_04"
  66. t.Run("Pipeline execution is successful", func(t *testing.T) {
  67. wd, _ := os.Getwd()
  68. pipe := DeserializePipelines([][]byte{[]byte(Payload)})[0]
  69. storageProvider := storage.GetFileSystemStorageProvider("test", "..")
  70. // copy test file to storage bucket
  71. _, err := storageProvider.StoreExisting(Bucket, "source.jpg", filepath.Join(wd, "../tests/files/900x900.jpg"))
  72. assert.Nil(t, err, "Test file should be readable")
  73. assert.FileExists(t, storageProvider.GetPath(Bucket, "source.jpg"))
  74. // run pipeline steps
  75. dest, err := pipe.Run("source.jpg", Bucket, storageProvider)
  76. assert.Nil(t, err)
  77. assert.FileExists(t, storageProvider.GetPath(Bucket, dest))
  78. // clean up
  79. os.Remove(storageProvider.GetPath(Bucket, "source.jpg"))
  80. os.Remove(storageProvider.GetPath(Bucket, dest))
  81. })
  82. }
  83. func TestResizeImage(t *testing.T) {
  84. const Payload string = `{
  85. "name": "example pipeline",
  86. "type": 1,
  87. "removeMetadata": false,
  88. "steps": [
  89. {
  90. "name": "resize image",
  91. "type": 0,
  92. "options": {
  93. "width": 1280,
  94. "height": 720,
  95. "upscale": false
  96. }
  97. }
  98. ]
  99. }`
  100. const Bucket string = "pipeline_test_01"
  101. t.Run("Image resizing is successful", func(t *testing.T) {
  102. wd, _ := os.Getwd()
  103. pipe := DeserializePipelines([][]byte{[]byte(Payload)})[0]
  104. storageProvider := storage.GetFileSystemStorageProvider("test", "..")
  105. // copy test file to storage bucket
  106. _, err := storageProvider.StoreExisting(Bucket, "source.jpg", filepath.Join(wd, "../tests/files/900x900.jpg"))
  107. assert.Nil(t, err, "Test file should be readable")
  108. assert.FileExists(t, storageProvider.GetPath(Bucket, "source.jpg"))
  109. // run pipeline steps
  110. dest, err := pipe.Run("source.jpg", Bucket, storageProvider)
  111. assert.Nil(t, err)
  112. assert.FileExists(t, storageProvider.GetPath(Bucket, dest))
  113. // read image config
  114. file, err := storageProvider.OpenFile(Bucket, dest)
  115. assert.Nil(t, err)
  116. imgConf, _, err := image.DecodeConfig(file)
  117. assert.Nil(t, err)
  118. assert.Equal(t, 1280, imgConf.Width)
  119. assert.Equal(t, 720, imgConf.Height)
  120. // clean up
  121. os.Remove(storageProvider.GetPath(Bucket, "source.jpg"))
  122. os.Remove(storageProvider.GetPath(Bucket, dest))
  123. })
  124. }
  125. func TestRotateImage(t *testing.T) {
  126. const Payload string = `{
  127. "name": "example pipeline",
  128. "type": 1,
  129. "removeMetadata": false,
  130. "steps": [
  131. {
  132. "name": "rotate image",
  133. "type": 1,
  134. "options": {
  135. "angle": 90.0
  136. }
  137. }
  138. ]
  139. }`
  140. const Bucket string = "pipeline_test_03"
  141. t.Run("Image rotation step is successful", func(t *testing.T) {
  142. wd, _ := os.Getwd()
  143. pipe := DeserializePipelines([][]byte{[]byte(Payload)})[0]
  144. storageProvider := storage.GetFileSystemStorageProvider("test", "..")
  145. // copy test file to storage bucket
  146. _, err := storageProvider.StoreExisting(Bucket, "source.jpg", filepath.Join(wd, "../tests/files/800x500.jpg"))
  147. assert.Nil(t, err, "Test file should be readable")
  148. assert.FileExists(t, storageProvider.GetPath(Bucket, "source.jpg"))
  149. // run pipeline steps
  150. dest, err := pipe.Run("source.jpg", Bucket, storageProvider)
  151. assert.Nil(t, err)
  152. assert.FileExists(t, storageProvider.GetPath(Bucket, dest))
  153. // read image config
  154. file, err := storageProvider.OpenFile(Bucket, dest)
  155. assert.Nil(t, err)
  156. imgConf, _, err := image.DecodeConfig(file)
  157. assert.Nil(t, err)
  158. assert.Equal(t, 500, imgConf.Width)
  159. assert.Equal(t, 800, imgConf.Height)
  160. // clean up
  161. os.Remove(storageProvider.GetPath(Bucket, "source.jpg"))
  162. os.Remove(storageProvider.GetPath(Bucket, dest))
  163. })
  164. }
  165. // output options
  166. func TestEncodeImageWithJpegQuality(t *testing.T) {
  167. const Payload string = `{
  168. "name": "example pipeline",
  169. "type": 1,
  170. "removeMetadata": false,
  171. "steps": [
  172. {
  173. "name": "resize image",
  174. "type": 0,
  175. "options": {
  176. "width": 1280,
  177. "height": 720,
  178. "upscale": false
  179. }
  180. }
  181. ],
  182. "output": {
  183. "quality": 50
  184. }
  185. }`
  186. const Bucket string = "pipeline_test_02"
  187. t.Run("Image encoding with jpeg quality is successful", func(t *testing.T) {
  188. wd, _ := os.Getwd()
  189. pipe := DeserializePipelines([][]byte{[]byte(Payload)})[0]
  190. storageProvider := storage.GetFileSystemStorageProvider("test", "..")
  191. // copy test file to storage bucket
  192. _, err := storageProvider.StoreExisting(Bucket, "source.jpg", filepath.Join(wd, "../tests/files/900x900.jpg"))
  193. assert.Nil(t, err, "Test file should be readable")
  194. assert.FileExists(t, storageProvider.GetPath(Bucket, "source.jpg"))
  195. // run pipeline steps
  196. dest, err := pipe.Run("source.jpg", Bucket, storageProvider)
  197. assert.Nil(t, err)
  198. assert.FileExists(t, storageProvider.GetPath(Bucket, dest))
  199. // clean up
  200. os.Remove(storageProvider.GetPath(Bucket, "source.jpg"))
  201. os.Remove(storageProvider.GetPath(Bucket, dest))
  202. })
  203. }