Commit 7d64670

mo khan <mo@mokhan.ca>
2015-06-16 02:35:10
move downloading to GoogleDrive class.
1 parent 070f8c1
app/jobs/download_from_drive_job.rb
@@ -2,34 +2,7 @@ class DownloadFromDriveJob < ActiveJob::Base
   queue_as :default
 
   def perform(user, params)
-    Dir.mktmpdir do |dir|
-      download_path = File.join(dir, params[:data][:title])
-      execute(create_command(
-        params[:data][:downloadUrl].strip,
-        download_path,
-        params[:accessToken]
-      ))
-      backup_file = BackupFile.new(user, File.new(download_path))
-      backup_file.process_later(Program.stronglifts)
-    end
-  end
-
-  private
-
-  def create_command(download_url, download_path, access_token)
-    command = <<-COMMAND
-curl '#{download_url}' \
--o '#{download_path}' \
--H 'Authorization: Bearer #{access_token}' \
--H 'Referer: http://stronglifters.dev/dashboard' \
--H 'Origin: http://stronglifters.dev' \
--H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36' \
---compressed
-    COMMAND
-    command
-  end
-
-  def execute(command)
-    `#{command}`
+    backup_file = user.google_drive.download(params)
+    backup_file.process_later(Program.stronglifts)
   end
 end
app/models/google_drive.rb
@@ -0,0 +1,38 @@
+class GoogleDrive
+  attr_reader :user
+
+  def initialize(user)
+    @user = user
+  end
+
+  def download(params)
+    Dir.mktmpdir do |dir|
+      download_path = File.join(dir, params[:data][:title])
+      execute(create_command(
+        params[:data][:downloadUrl].strip,
+        download_path,
+        params[:accessToken]
+      ))
+      return BackupFile.new(user, File.new(download_path))
+    end
+  end
+
+  private
+
+  def create_command(download_url, download_path, access_token)
+    command = <<-COMMAND
+curl '#{download_url}' \
+-o '#{download_path}' \
+-H 'Authorization: Bearer #{access_token}' \
+-H 'Referer: http://stronglifters.dev/dashboard' \
+-H 'Origin: http://stronglifters.dev' \
+-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36' \
+--compressed
+    COMMAND
+    command
+  end
+
+  def execute(command)
+    `#{command}`
+  end
+end
app/models/user.rb
@@ -45,6 +45,10 @@ class User < ActiveRecord::Base
     end
   end
 
+  def google_drive
+    GoogleDrive.new(self)
+  end
+
   def self.authenticate(username,password)
     if user = User.where("email = :email OR username = :username", username: username, email: username).first
       user.authenticate(password)
spec/jobs/download_from_drive_job_spec.rb
@@ -3,21 +3,13 @@ require "rails_helper"
 RSpec.describe DownloadFromDriveJob, type: :job do
   describe "#perform" do
     let(:user) { build(:user) }
-    let(:params) do
-      {
-        accessToken: access_token,
-        data: {
-          title: filename,
-          downloadUrl: 'https://www.stronglifters.com/'
-        },
-      }
-    end
-    let(:filename) { "#{FFaker::Internet.user_name}.html" }
-    let(:access_token) { FFaker::Internet.user_name }
+    let(:params) { { } }
     let(:backup_file) { double(process_later: true) }
+    let(:drive) { instance_double(GoogleDrive) }
 
     it "downloads the file for further processing" do
-      allow(BackupFile).to receive(:new).and_return(backup_file)
+      allow(user).to receive(:google_drive).and_return(drive)
+      allow(drive).to receive(:download).with(params).and_return(backup_file)
       subject.perform(user, params)
       expect(backup_file).to have_received(:process_later).with(Program.stronglifts)
     end
spec/models/google_drive_spec.rb
@@ -0,0 +1,27 @@
+require "rails_helper"
+
+describe GoogleDrive do
+  subject { GoogleDrive.new(user) }
+  let(:user) { build(:user) }
+
+  describe "#download" do
+    let(:params) do
+      {
+        accessToken: access_token,
+        data: {
+          title: filename,
+          downloadUrl: 'https://www.stronglifters.com/'
+        },
+      }
+    end
+
+    let(:filename) { "#{FFaker::Internet.user_name}.html" }
+    let(:access_token) { FFaker::Internet.user_name }
+
+    it "downloads the specified google drive file" do
+      result = subject.download(params)
+      expect(result.user).to eql(user)
+      expect(result.backup_file.path).to end_with(filename)
+    end
+  end
+end
spec/models/user_spec.rb
@@ -168,4 +168,12 @@ describe User do
       expect(todays_result).to_not eql(tomorrows_result)
     end
   end
+
+  describe "#google_drive" do
+    it "returns the users google drive" do
+      result = subject.google_drive
+      expect(result).to be_instance_of(GoogleDrive)
+      expect(result.user).to eql(subject)
+    end
+  end
 end