From f94c0283b24c9c3767fd9267c4cd4afdb562ffa9 Mon Sep 17 00:00:00 2001
From: Vinoth Kannan <svkn.87@gmail.com>
Date: Fri, 11 Jan 2019 18:35:38 +0530
Subject: [PATCH] FIX: Use correct version when generating file path for
 optimized image (#6871)

---
 lib/file_store/base_store.rb                   |  3 ++-
 spec/components/file_store/base_store_spec.rb  | 15 +++++++++++++++
 spec/components/file_store/s3_store_spec.rb    | 18 ++++++++++++++++++
 spec/fabricators/optimized_image_fabricator.rb |  1 +
 4 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/lib/file_store/base_store.rb b/lib/file_store/base_store.rb
index 9043205c88b..2c8b416eff9 100644
--- a/lib/file_store/base_store.rb
+++ b/lib/file_store/base_store.rb
@@ -116,7 +116,8 @@ module FileStore
 
     def get_path_for_optimized_image(optimized_image)
       upload = optimized_image.upload
-      extension = "_#{OptimizedImage::VERSION}_#{optimized_image.width}x#{optimized_image.height}#{optimized_image.extension}"
+      version = optimized_image.version || 1
+      extension = "_#{version}_#{optimized_image.width}x#{optimized_image.height}#{optimized_image.extension}"
       get_path_for("optimized".freeze, upload.id, upload.sha1, extension)
     end
 
diff --git a/spec/components/file_store/base_store_spec.rb b/spec/components/file_store/base_store_spec.rb
index 20d898ee36b..3de0ff29488 100644
--- a/spec/components/file_store/base_store_spec.rb
+++ b/spec/components/file_store/base_store_spec.rb
@@ -19,4 +19,19 @@ RSpec.describe FileStore::BaseStore do
       end
     end
   end
+
+  describe '#get_path_for_optimized_image' do
+    let(:upload) { Fabricate(:upload) }
+    let(:optimized_path) { "optimized/1X/#{upload.sha1}_1_100x200.png" }
+
+    it 'should return the right path' do
+      optimized = Fabricate(:optimized_image, upload: upload, version: 1)
+      expect(FileStore::BaseStore.new.get_path_for_optimized_image(optimized)).to eq(optimized_path)
+    end
+
+    it 'should return the right path for `nil` version' do
+      optimized = Fabricate(:optimized_image, upload: upload, version: nil)
+      expect(FileStore::BaseStore.new.get_path_for_optimized_image(optimized)).to eq(optimized_path)
+    end
+  end
 end
diff --git a/spec/components/file_store/s3_store_spec.rb b/spec/components/file_store/s3_store_spec.rb
index 21f77761c75..e18a09231ec 100644
--- a/spec/components/file_store/s3_store_spec.rb
+++ b/spec/components/file_store/s3_store_spec.rb
@@ -164,6 +164,24 @@ describe FileStore::S3Store do
         store.remove_upload(upload)
       end
 
+      it "removes the optimized image from s3 with the right paths" do
+        optimized = Fabricate(:optimized_image, version: 1)
+        upload = optimized.upload
+        path = "optimized/1X/#{upload.sha1}_#{optimized.version}_#{optimized.width}x#{optimized.height}.png"
+
+        store.expects(:get_depth_for).with(upload.id).returns(0)
+        s3_helper.expects(:s3_bucket).returns(s3_bucket).at_least_once
+        optimized.update_attributes!(url: "//s3-upload-bucket.s3.dualstack.us-west-1.amazonaws.com/#{path}")
+        s3_object = stub
+
+        s3_bucket.expects(:object).with("tombstone/#{path}").returns(s3_object)
+        s3_object.expects(:copy_from).with(copy_source: "s3-upload-bucket/#{path}")
+        s3_bucket.expects(:object).with(path).returns(s3_object)
+        s3_object.expects(:delete)
+
+        store.remove_optimized_image(optimized)
+      end
+
       describe "when s3_upload_bucket includes folders path" do
         before do
           SiteSetting.s3_upload_bucket = "s3-upload-bucket/discourse-uploads"
diff --git a/spec/fabricators/optimized_image_fabricator.rb b/spec/fabricators/optimized_image_fabricator.rb
index 30fafd2f418..2ac3b8a96a6 100644
--- a/spec/fabricators/optimized_image_fabricator.rb
+++ b/spec/fabricators/optimized_image_fabricator.rb
@@ -5,4 +5,5 @@ Fabricator(:optimized_image) do
   width 100
   height 200
   url "138569_100x200.png"
+  version OptimizedImage::VERSION
 end