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.

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