From 4f06d6078b49dde63d47db199bbf8563c3468c2f Mon Sep 17 00:00:00 2001
From: OsamaSayegh <asooomaasoooma90@gmail.com>
Date: Mon, 11 Jun 2018 07:54:16 +0300
Subject: [PATCH] REFACTOR: admin themes controller specs to requests (#5954)

---
 .../admin/themes_controller_spec.rb           | 205 ------------------
 spec/requests/admin/themes_controller_spec.rb | 202 +++++++++++++++++
 2 files changed, 202 insertions(+), 205 deletions(-)
 delete mode 100644 spec/controllers/admin/themes_controller_spec.rb
 create mode 100644 spec/requests/admin/themes_controller_spec.rb

diff --git a/spec/controllers/admin/themes_controller_spec.rb b/spec/controllers/admin/themes_controller_spec.rb
deleted file mode 100644
index 56443196635..00000000000
--- a/spec/controllers/admin/themes_controller_spec.rb
+++ /dev/null
@@ -1,205 +0,0 @@
-require 'rails_helper'
-require_dependency 'theme_serializer'
-
-describe Admin::ThemesController do
-
-  it "is a subclass of AdminController" do
-    expect(Admin::UsersController < Admin::AdminController).to eq(true)
-  end
-
-  context 'while logged in as an admin' do
-    before do
-      @user = log_in(:admin)
-    end
-
-    context '.generate_key_pair' do
-      it 'can generate key pairs' do
-        post :generate_key_pair, format: :json
-        json = JSON.parse(response.body)
-        expect(json["private_key"]).to include("RSA PRIVATE KEY")
-        expect(json["public_key"]).to include("ssh-rsa ")
-      end
-    end
-
-    context '.upload_asset' do
-      render_views
-
-      let(:upload) do
-        Rack::Test::UploadedFile.new(file_from_fixtures("fake.woff2", "woff2"))
-      end
-
-      it 'can create a theme upload' do
-        post :upload_asset, params: { file: upload }, format: :json
-        expect(response.status).to eq(201)
-
-        upload = Upload.find_by(original_filename: "fake.woff2")
-
-        expect(upload.id).not_to be_nil
-        expect(JSON.parse(response.body)["upload_id"]).to eq(upload.id)
-      end
-    end
-
-    context '.import' do
-      let(:theme_file) do
-        Rack::Test::UploadedFile.new(file_from_fixtures("sam-s-simple-theme.dcstyle.json", "json"))
-      end
-
-      let :image do
-        file_from_fixtures("logo.png")
-      end
-
-      it 'can import a theme with an upload' do
-        upload = Fabricate(:upload)
-        theme = Theme.new(name: 'with-upload', user_id: -1)
-        upload = UploadCreator.new(image, "logo.png").create_for(-1)
-        theme.set_field(target: :common, name: :logo, upload_id: upload.id, type: :theme_upload_var)
-        theme.save
-
-        json = ThemeWithEmbeddedUploadsSerializer.new(theme, root: 'theme').to_json
-        theme.destroy
-
-        temp = Tempfile.new
-        temp.write(json)
-        temp.rewind
-
-        uploaded_json = Rack::Test::UploadedFile.new(temp)
-        upload.destroy
-
-        post :import, params: { theme: uploaded_json }, format: :json
-        expect(response.status).to eq(201)
-        temp.unlink
-
-        theme = Theme.last
-        expect(theme.theme_fields.count).to eq(1)
-        expect(theme.theme_fields.first.upload).not_to eq(nil)
-        expect(theme.theme_fields.first.upload.filesize).to eq(upload.filesize)
-        expect(theme.theme_fields.first.upload.sha1).to eq(upload.sha1)
-        expect(theme.theme_fields.first.upload.original_filename).to eq(upload.original_filename)
-      end
-
-      it 'imports a theme' do
-        post :import, params: { theme: theme_file }, format: :json
-        expect(response.status).to eq(201)
-
-        json = ::JSON.parse(response.body)
-
-        expect(json["theme"]["name"]).to eq("Sam's Simple Theme")
-        expect(json["theme"]["theme_fields"].length).to eq(2)
-        expect(UserHistory.where(action: UserHistory.actions[:change_theme]).count).to eq(1)
-      end
-    end
-
-    context ' .index' do
-      it 'correctly returns themes' do
-
-        ColorScheme.destroy_all
-        Theme.destroy_all
-
-        theme = Theme.new(name: 'my name', user_id: -1)
-        theme.set_field(target: :common, name: :scss, value: '.body{color: black;}')
-        theme.set_field(target: :desktop, name: :after_header, value: '<b>test</b>')
-
-        theme.remote_theme = RemoteTheme.new(
-          remote_url: 'awesome.git',
-          remote_version: '7',
-          local_version: '8',
-          remote_updated_at: Time.zone.now
-        )
-
-        theme.save!
-
-        # this will get serialized as well
-        ColorScheme.create_from_base(name: "test", colors: [])
-
-        get :index, format: :json
-
-        expect(response.status).to eq(200)
-
-        json = ::JSON.parse(response.body)
-
-        expect(json["extras"]["color_schemes"].length).to eq(2)
-        theme_json = json["themes"].find { |t| t["id"] == theme.id }
-        expect(theme_json["theme_fields"].length).to eq(2)
-        expect(theme_json["remote_theme"]["remote_version"]).to eq("7")
-      end
-    end
-
-    context ' .create' do
-      it 'creates a theme' do
-        post :create, params: {
-          theme: {
-            name: 'my test name',
-            theme_fields: [name: 'scss', target: 'common', value: 'body{color: red;}']
-          }
-        }, format: :json
-
-        expect(response.status).to eq(201)
-
-        json = ::JSON.parse(response.body)
-
-        expect(json["theme"]["theme_fields"].length).to eq(1)
-        expect(UserHistory.where(action: UserHistory.actions[:change_theme]).count).to eq(1)
-      end
-    end
-
-    context ' .update' do
-      let(:theme) { Theme.create(name: 'my name', user_id: -1) }
-
-      it 'can change default theme' do
-        SiteSetting.default_theme_key = nil
-
-        put :update, params: {
-          id: theme.id, theme: { default: true }
-        }, format: :json
-
-        expect(SiteSetting.default_theme_key).to eq(theme.key)
-      end
-
-      it 'can unset default theme' do
-        SiteSetting.default_theme_key = theme.key
-
-        put :update, params: {
-          id: theme.id, theme: { default: false }
-        }, format: :json
-
-        expect(SiteSetting.default_theme_key).to be_blank
-      end
-
-      it 'updates a theme' do
-        theme.set_field(target: :common, name: :scss, value: '.body{color: black;}')
-        theme.save
-
-        child_theme = Theme.create(name: 'my name', user_id: -1)
-
-        upload = Fabricate(:upload)
-
-        put :update, params: {
-          id: theme.id,
-          theme: {
-            child_theme_ids: [child_theme.id],
-            name: 'my test name',
-            theme_fields: [
-              { name: 'scss', target: 'common', value: '' },
-              { name: 'scss', target: 'desktop', value: 'body{color: blue;}' },
-              { name: 'bob', target: 'common', value: '', type_id: 2, upload_id: upload.id },
-            ]
-          }
-        }, format: :json
-
-        expect(response.status).to eq(200)
-
-        json = ::JSON.parse(response.body)
-
-        fields = json["theme"]["theme_fields"].sort { |a, b| a["value"] <=> b["value"] }
-
-        expect(fields[0]["value"]).to eq('')
-        expect(fields[0]["upload_id"]).to eq(upload.id)
-        expect(fields[1]["value"]).to eq('body{color: blue;}')
-        expect(fields.length).to eq(2)
-        expect(json["theme"]["child_themes"].length).to eq(1)
-        expect(UserHistory.where(action: UserHistory.actions[:change_theme]).count).to eq(1)
-      end
-    end
-  end
-
-end
diff --git a/spec/requests/admin/themes_controller_spec.rb b/spec/requests/admin/themes_controller_spec.rb
new file mode 100644
index 00000000000..e0416191afa
--- /dev/null
+++ b/spec/requests/admin/themes_controller_spec.rb
@@ -0,0 +1,202 @@
+require 'rails_helper'
+require_dependency 'theme_serializer'
+
+describe Admin::ThemesController do
+  let(:admin) { Fabricate(:admin) }
+
+  it "is a subclass of AdminController" do
+    expect(Admin::UsersController < Admin::AdminController).to eq(true)
+  end
+
+  before do
+    sign_in(admin)
+  end
+
+  describe '#generate_key_pair' do
+    it 'can generate key pairs' do
+      post "/admin/themes/generate_key_pair.json"
+      expect(response.status).to eq(200)
+      json = JSON.parse(response.body)
+      expect(json["private_key"]).to include("RSA PRIVATE KEY")
+      expect(json["public_key"]).to include("ssh-rsa ")
+    end
+  end
+
+  describe '#upload_asset' do
+    let(:upload) do
+      Rack::Test::UploadedFile.new(file_from_fixtures("fake.woff2", "woff2"))
+    end
+
+    it 'can create a theme upload' do
+      post "/admin/themes/upload_asset.json", params: { file: upload }
+      expect(response.status).to eq(201)
+
+      upload = Upload.find_by(original_filename: "fake.woff2")
+
+      expect(upload.id).not_to be_nil
+      expect(JSON.parse(response.body)["upload_id"]).to eq(upload.id)
+    end
+  end
+
+  describe '#import' do
+    let(:theme_file) do
+      Rack::Test::UploadedFile.new(file_from_fixtures("sam-s-simple-theme.dcstyle.json", "json"))
+    end
+
+    let(:image) do
+      file_from_fixtures("logo.png")
+    end
+
+    it 'can import a theme with an upload' do
+      upload = Fabricate(:upload)
+      theme = Theme.new(name: 'with-upload', user_id: -1)
+      upload = UploadCreator.new(image, "logo.png").create_for(-1)
+      theme.set_field(target: :common, name: :logo, upload_id: upload.id, type: :theme_upload_var)
+      theme.save!
+
+      json = ThemeWithEmbeddedUploadsSerializer.new(theme, root: 'theme').to_json
+      theme.destroy
+
+      temp = Tempfile.new
+      temp.write(json)
+      temp.rewind
+
+      uploaded_json = Rack::Test::UploadedFile.new(temp)
+      upload.destroy
+
+      post "/admin/themes/import.json", params: { theme: uploaded_json }
+      expect(response.status).to eq(201)
+      temp.unlink
+
+      theme = Theme.last
+      expect(theme.theme_fields.count).to eq(1)
+      expect(theme.theme_fields.first.upload).not_to eq(nil)
+      expect(theme.theme_fields.first.upload.filesize).to eq(upload.filesize)
+      expect(theme.theme_fields.first.upload.sha1).to eq(upload.sha1)
+      expect(theme.theme_fields.first.upload.original_filename).to eq(upload.original_filename)
+    end
+
+    it 'imports a theme' do
+      post "/admin/themes/import.json", params: { theme: theme_file }
+      expect(response.status).to eq(201)
+
+      json = ::JSON.parse(response.body)
+
+      expect(json["theme"]["name"]).to eq("Sam's Simple Theme")
+      expect(json["theme"]["theme_fields"].length).to eq(2)
+      expect(UserHistory.where(action: UserHistory.actions[:change_theme]).count).to eq(1)
+    end
+  end
+
+  describe '#index' do
+    it 'correctly returns themes' do
+      ColorScheme.destroy_all
+      Theme.destroy_all
+
+      theme = Theme.new(name: 'my name', user_id: -1)
+      theme.set_field(target: :common, name: :scss, value: '.body{color: black;}')
+      theme.set_field(target: :desktop, name: :after_header, value: '<b>test</b>')
+
+      theme.remote_theme = RemoteTheme.new(
+        remote_url: 'awesome.git',
+        remote_version: '7',
+        local_version: '8',
+        remote_updated_at: Time.zone.now
+      )
+
+      theme.save!
+
+      # this will get serialized as well
+      ColorScheme.create_from_base(name: "test", colors: [])
+
+      get "/admin/themes.json"
+
+      expect(response.status).to eq(200)
+
+      json = ::JSON.parse(response.body)
+
+      expect(json["extras"]["color_schemes"].length).to eq(2)
+      theme_json = json["themes"].find { |t| t["id"] == theme.id }
+      expect(theme_json["theme_fields"].length).to eq(2)
+      expect(theme_json["remote_theme"]["remote_version"]).to eq("7")
+    end
+  end
+
+  describe '#create' do
+    it 'creates a theme' do
+      post "/admin/themes.json", params: {
+        theme: {
+          name: 'my test name',
+          theme_fields: [name: 'scss', target: 'common', value: 'body{color: red;}']
+        }
+      }
+
+      expect(response.status).to eq(201)
+
+      json = ::JSON.parse(response.body)
+
+      expect(json["theme"]["theme_fields"].length).to eq(1)
+      expect(UserHistory.where(action: UserHistory.actions[:change_theme]).count).to eq(1)
+    end
+  end
+
+  describe '#update' do
+    let(:theme) { Theme.create(name: 'my name', user_id: -1) }
+
+    it 'can change default theme' do
+      SiteSetting.default_theme_key = nil
+
+      put "/admin/themes/#{theme.id}.json", params: {
+        id: theme.id, theme: { default: true }
+      }
+
+      expect(response.status).to eq(200)
+      expect(SiteSetting.default_theme_key).to eq(theme.key)
+    end
+
+    it 'can unset default theme' do
+      SiteSetting.default_theme_key = theme.key
+
+      put "/admin/themes/#{theme.id}.json", params: {
+        theme: { default: false }
+      }
+
+      expect(response.status).to eq(200)
+      expect(SiteSetting.default_theme_key).to be_blank
+    end
+
+    it 'updates a theme' do
+      theme.set_field(target: :common, name: :scss, value: '.body{color: black;}')
+      theme.save
+
+      child_theme = Theme.create(name: 'my name', user_id: -1)
+
+      upload = Fabricate(:upload)
+
+      put "/admin/themes/#{theme.id}.json", params: {
+        theme: {
+          child_theme_ids: [child_theme.id],
+          name: 'my test name',
+          theme_fields: [
+            { name: 'scss', target: 'common', value: '' },
+            { name: 'scss', target: 'desktop', value: 'body{color: blue;}' },
+            { name: 'bob', target: 'common', value: '', type_id: 2, upload_id: upload.id },
+          ]
+        }
+      }
+
+      expect(response.status).to eq(200)
+
+      json = ::JSON.parse(response.body)
+
+      fields = json["theme"]["theme_fields"].sort { |a, b| a["value"] <=> b["value"] }
+
+      expect(fields[0]["value"]).to eq('')
+      expect(fields[0]["upload_id"]).to eq(upload.id)
+      expect(fields[1]["value"]).to eq('body{color: blue;}')
+      expect(fields.length).to eq(2)
+      expect(json["theme"]["child_themes"].length).to eq(1)
+      expect(UserHistory.where(action: UserHistory.actions[:change_theme]).count).to eq(1)
+    end
+  end
+end