Skip to content

Commit ec7b0ae

Browse files
committed
#395 dojo_event_services:upsert の修正 + RSpec 追加 with factory_bot_rails
1 parent d7b347c commit ec7b0ae

File tree

7 files changed

+126
-8
lines changed

7 files changed

+126
-8
lines changed

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ group :development, :test do
6262
gem 'selenium-webdriver'
6363
gem 'capybara'
6464
gem 'rspec-rails', '~> 3.5'
65+
gem 'factory_bot_rails'
6566

6667
gem 'dotenv-rails'
6768
end

Gemfile.lock

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ GEM
9090
ethon (0.11.0)
9191
ffi (>= 1.3.0)
9292
execjs (2.7.0)
93+
factory_bot (5.0.2)
94+
activesupport (>= 4.2.0)
95+
factory_bot_rails (5.0.1)
96+
factory_bot (~> 5.0.0)
97+
railties (>= 4.2.0)
9398
faraday (0.15.4)
9499
multipart-post (>= 1.2, < 3)
95100
faraday_middleware (0.12.2)
@@ -400,6 +405,7 @@ DEPENDENCIES
400405
coffee-rails
401406
dotenv-rails
402407
dumper
408+
factory_bot_rails
403409
faraday
404410
faraday_middleware
405411
flamegraph

lib/tasks/dojo_event_services.rake

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
namespace :dojo_event_services do
22
desc '現在のyamlファイルを元にデータベースを更新します'
33
task upsert: :environment do
4-
result = { inserted: [], updated: [], kept: [], skipped: [] }
4+
result = { inserted: [], updated: [], deleted: [], kept: [], skipped: [] }
55

66
list = YAML.load_file(Rails.root.join('db','dojo_event_services.yaml'))
77
list.each do |des|
88
unless DojoEventService.names.keys.include?(des['name'])
9-
event_names = DojoEventService.names.keys.map {|s| "`#{s}`" }
9+
event_names = DojoEventService.names.keys.map { |s| "`#{s}`" }
1010
result[:skipped] << [des['dojo_id'], "Not used #{event_names.join(' or ')}"]
1111
next
1212
end
@@ -19,7 +19,14 @@ namespace :dojo_event_services do
1919
# 比較対象は URL を除く dojo_id, name, group_id
2020
url = des.delete('url')
2121
dojo_event_service = dojo.dojo_event_services.find_or_initialize_by(des)
22-
dojo.dojo_event_services.where(des).where.not(id: dojo_event_service.id).destroy_all
22+
overlapped = dojo.dojo_event_services.where(des).where.not(id: dojo_event_service.id)
23+
if overlapped.present?
24+
overlapped.each do |d|
25+
result[:deleted] << ["#{d.dojo_id}:#{d.id}"]
26+
end
27+
overlapped.destroy_all
28+
end
29+
dojo_event_service.url = url
2330
if dojo_event_service.changed?
2431
changes = dojo_event_service.changes
2532
new_record = dojo_event_service.new_record?
@@ -31,14 +38,13 @@ namespace :dojo_event_services do
3138
end
3239

3340
# Dump result
34-
if !result[:inserted].empty? || !result[:updated].empty?
35-
result[:skipped] = result[:skipped].uniq {|s| s.first }
41+
if result[:inserted] || result[:updated]
42+
result[:skipped] = result[:skipped].uniq { |s| s.first }
3643
result.except!(:kept, :skipped) unless ENV.key?('DEBUG')
37-
sorted = result.sort_by {|_, v| v.length }.reverse.to_h
38-
puts
44+
sorted = result.sort_by { |_, v| v.length }.reverse.to_h
3945
sorted.each do |k, v|
4046
puts "#{k.to_s.camelcase}: #{v.length}"
41-
v.each {|x| puts " #{x.join(': ')}"}
47+
v.each { |x| puts " #{x.join(': ')}" }
4248
end
4349
end
4450
end

spec/factories/dojo_event_services.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
require 'factory_bot'
2+
3+
FactoryBot.define do
4+
factory :dojo_event_service do
5+
# dojo_id
6+
name { :connpass }
7+
url { '' }
8+
group_id { '9999' }
9+
end
10+
end

spec/factories/dojos.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
FactoryBot.define do
2+
factory :dojo do
3+
name { 'dojo name' }
4+
email { '' }
5+
description { '' }
6+
prefecture_id { 13 }
7+
end
8+
end
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
require 'rails_helper'
2+
require 'rake'
3+
4+
RSpec.describe 'dojo_event_services' do
5+
before(:all) do
6+
@rake = Rake::Application.new
7+
Rake.application = @rake
8+
Rake.application.rake_require 'tasks/dojo_event_services'
9+
Rake::Task.define_task(:environment)
10+
end
11+
12+
before(:each) do
13+
@rake[task].reenable
14+
end
15+
16+
describe 'dojo_event_services:upsert' do
17+
before :each do
18+
@dojo_1 = create(:dojo, name: 'dojo_1', email: 'mail_1@test', tags: %w(Scratch ラズベリーパイ), description: '月1回開催', prefecture_id: 13)
19+
@dojo_2 = create(:dojo, name: 'dojo_2', email: 'mail_2@test', tags: %w(Scratch), description: '隔週開催', prefecture_id: 13)
20+
@dojo_3 = create(:dojo, name: 'dojo_3', email: 'mail_3@test', tags: %w(Scratch ラズベリーパイ Webサイト), description: '月1回開催', prefecture_id: 13)
21+
22+
create(:dojo_event_service, dojo_id: @dojo_1.id, name: :doorkeeper, group_id: '10001', url: 'https://coder-dojo-11.doorkeeper.jp/')
23+
create(:dojo_event_service, dojo_id: @dojo_1.id, name: :doorkeeper, group_id: '10002', url: 'https://coder-dojo-12.doorkeeper.jp/abc')
24+
create(:dojo_event_service, dojo_id: @dojo_1.id, name: :doorkeeper, group_id: '10002', url: 'https://coder-dojo-12.doorkeeper.jp/')
25+
create(:dojo_event_service, dojo_id: @dojo_2.id, name: :connpass, group_id: '20001', url: 'https://coder-dojo-21.connpass.jp/')
26+
end
27+
28+
let(:task) { 'dojo_event_services:upsert' }
29+
30+
it '単純追加' do
31+
allow(YAML).to receive(:load_file).and_return([
32+
{ 'dojo_id' => @dojo_3.id, "name" => 'facebook', 'group_id' => '30001', 'url' => 'https://coder-dojo-31.facebook.com/' }
33+
])
34+
35+
# before
36+
expect(DojoEventService.count).to eq(4)
37+
38+
# exec
39+
expect(@rake[task].invoke).to be_truthy
40+
41+
# after
42+
expect(DojoEventService.count).to eq(5)
43+
new_records = DojoEventService.where(dojo_id: @dojo_3.id, name: :facebook, group_id: '30001')
44+
expect(new_records.count).to eq(1)
45+
expect(new_records.first.url).to eq('https://coder-dojo-31.facebook.com/')
46+
end
47+
48+
it '単純更新' do
49+
allow(YAML).to receive(:load_file).and_return([
50+
{ 'dojo_id' => @dojo_2.id, "name" => 'connpass', 'group_id' => '20001', 'url' => 'https://coder-dojo-21.connpass.jp/zzz' }
51+
])
52+
53+
# before
54+
expect(DojoEventService.count).to eq(4)
55+
56+
# exec
57+
expect(@rake[task].invoke).to be_truthy
58+
59+
# after
60+
expect(DojoEventService.count).to eq(4)
61+
mod_records = DojoEventService.where(dojo_id: @dojo_2.id, name: :connpass, group_id: '20001')
62+
expect(mod_records.count).to eq(1)
63+
expect(mod_records.first.url).to eq('https://coder-dojo-21.connpass.jp/zzz')
64+
end
65+
66+
it '余剰データ削除 & 更新' do
67+
allow(YAML).to receive(:load_file).and_return([
68+
{ 'dojo_id' => @dojo_1.id, "name" => 'doorkeeper', 'group_id' => '10002', 'url' => 'https://coder-dojo-12.doorkeeper.jp/12345' }
69+
])
70+
71+
# before
72+
expect(DojoEventService.count).to eq(4)
73+
expect(DojoEventService.where(dojo_id: @dojo_1.id, name: :doorkeeper, group_id: '10002').size).to eq(2)
74+
75+
# exec
76+
expect(@rake[task].invoke).to be_truthy
77+
78+
# after
79+
expect(DojoEventService.count).to eq(3)
80+
mod_records = DojoEventService.where(dojo_id: @dojo_1.id, name: :doorkeeper, group_id: '10002')
81+
expect(mod_records.count).to eq(1)
82+
expect(mod_records.first.url).to eq('https://coder-dojo-12.doorkeeper.jp/12345')
83+
end
84+
end
85+
end

spec/rails_helper.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,6 @@
6262
example.skip
6363
end
6464
end
65+
66+
config.include FactoryBot::Syntax::Methods
6567
end

0 commit comments

Comments
 (0)