Refactor exports controller (#1567)
* Add basic coverage for settings/exports controller * Remove unused @account variable from settings/exports controller * Add coverage for download export actions * Remove deprecated `render :text` in favor of `send_data` for csv downloads * Add model to handle exports * Use Export class in settings/exports controller * Simplify settings/exports controller methods * Move settings/export to more restful routesmaster
parent
1921c5416b
commit
3ddd936b03
@ -0,0 +1,17 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
module Settings |
||||
module Exports |
||||
class BlockedAccountsController < ApplicationController |
||||
before_action :authenticate_user! |
||||
|
||||
def index |
||||
export_data = Export.new(current_account.blocking).to_csv |
||||
|
||||
respond_to do |format| |
||||
format.csv { send_data export_data, filename: 'blocking.csv' } |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,17 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
module Settings |
||||
module Exports |
||||
class FollowingAccountsController < ApplicationController |
||||
before_action :authenticate_user! |
||||
|
||||
def index |
||||
export_data = Export.new(current_account.following).to_csv |
||||
|
||||
respond_to do |format| |
||||
format.csv { send_data export_data, filename: 'following.csv' } |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
@ -1,46 +1,13 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
require 'csv' |
||||
|
||||
class Settings::ExportsController < ApplicationController |
||||
layout 'admin' |
||||
|
||||
before_action :authenticate_user! |
||||
before_action :set_account |
||||
|
||||
def show |
||||
@total_storage = current_account.media_attachments.sum(:file_file_size) |
||||
@total_follows = current_account.following.count |
||||
@total_blocks = current_account.blocking.count |
||||
end |
||||
|
||||
def download_following_list |
||||
@accounts = current_account.following |
||||
|
||||
respond_to do |format| |
||||
format.csv { render text: accounts_list_to_csv(@accounts) } |
||||
end |
||||
end |
||||
|
||||
def download_blocking_list |
||||
@accounts = current_account.blocking |
||||
|
||||
respond_to do |format| |
||||
format.csv { render text: accounts_list_to_csv(@accounts) } |
||||
end |
||||
end |
||||
|
||||
private |
||||
|
||||
def set_account |
||||
@account = current_user.account |
||||
end |
||||
|
||||
def accounts_list_to_csv(list) |
||||
CSV.generate do |csv| |
||||
list.each do |account| |
||||
csv << [(account.local? ? account.local_username_and_domain : account.acct)] |
||||
end |
||||
end |
||||
end |
||||
end |
||||
|
@ -0,0 +1,18 @@ |
||||
# frozen_string_literal: true |
||||
require 'csv' |
||||
|
||||
class Export |
||||
attr_reader :accounts |
||||
|
||||
def initialize(accounts) |
||||
@accounts = accounts |
||||
end |
||||
|
||||
def to_csv |
||||
CSV.generate do |csv| |
||||
accounts.each do |account| |
||||
csv << [(account.local? ? account.local_username_and_domain : account.acct)] |
||||
end |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,17 @@ |
||||
require 'rails_helper' |
||||
|
||||
describe Settings::Exports::BlockedAccountsController do |
||||
before do |
||||
sign_in Fabricate(:user), scope: :user |
||||
end |
||||
|
||||
describe 'GET #index' do |
||||
it 'returns a csv of the blocking accounts' do |
||||
get :index, format: :csv |
||||
|
||||
expect(response).to have_http_status(:success) |
||||
expect(response.content_type).to eq 'text/csv' |
||||
expect(response.headers['Content-Disposition']).to eq 'attachment; filename="blocking.csv"' |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,17 @@ |
||||
require 'rails_helper' |
||||
|
||||
describe Settings::Exports::FollowingAccountsController do |
||||
before do |
||||
sign_in Fabricate(:user), scope: :user |
||||
end |
||||
|
||||
describe 'GET #index' do |
||||
it 'returns a csv of the following accounts' do |
||||
get :index, format: :csv |
||||
|
||||
expect(response).to have_http_status(:success) |
||||
expect(response.content_type).to eq 'text/csv' |
||||
expect(response.headers['Content-Disposition']).to eq 'attachment; filename="following.csv"' |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,14 @@ |
||||
require 'rails_helper' |
||||
|
||||
describe Settings::ExportsController do |
||||
before do |
||||
sign_in Fabricate(:user), scope: :user |
||||
end |
||||
|
||||
describe 'GET #show' do |
||||
it 'returns http success' do |
||||
get :show |
||||
expect(response).to have_http_status(:success) |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,17 @@ |
||||
require 'rails_helper' |
||||
|
||||
describe Export do |
||||
describe 'to_csv' do |
||||
it 'returns a csv of the accounts' do |
||||
one = Account.new(username: 'one', domain: 'local.host') |
||||
two = Account.new(username: 'two', domain: 'local.host') |
||||
accounts = [one, two] |
||||
|
||||
export = Export.new(accounts).to_csv |
||||
results = export.strip.split |
||||
|
||||
expect(results.size).to eq 2 |
||||
expect(results.first).to eq 'one@local.host' |
||||
end |
||||
end |
||||
end |
Loading…
Reference in new issue