ruby-trello 2.3.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +13 -2
- data/lib/trello.rb +13 -7
- data/lib/trello/action.rb +27 -21
- data/lib/trello/attachment.rb +40 -27
- data/lib/trello/basic_data.rb +104 -9
- data/lib/trello/board.rb +88 -102
- data/lib/trello/card.rb +34 -235
- data/lib/trello/checklist.rb +17 -71
- data/lib/trello/comment.rb +32 -22
- data/lib/trello/cover_image.rb +20 -0
- data/lib/trello/custom_field.rb +31 -84
- data/lib/trello/custom_field_item.rb +36 -58
- data/lib/trello/custom_field_option.rb +40 -13
- data/lib/trello/item.rb +27 -16
- data/lib/trello/item_state.rb +7 -15
- data/lib/trello/json_utils.rb +1 -1
- data/lib/trello/label.rb +14 -101
- data/lib/trello/label_name.rb +22 -25
- data/lib/trello/list.rb +31 -44
- data/lib/trello/member.rb +77 -32
- data/lib/trello/notification.rb +27 -20
- data/lib/trello/organization.rb +53 -25
- data/lib/trello/plugin_datum.rb +11 -16
- data/lib/trello/schema.rb +31 -0
- data/lib/trello/schema/attribute/base.rb +79 -0
- data/lib/trello/schema/attribute/board_pref.rb +45 -0
- data/lib/trello/schema/attribute/custom_field_display.rb +45 -0
- data/lib/trello/schema/attribute/default.rb +45 -0
- data/lib/trello/schema/attribute_builder.rb +42 -0
- data/lib/trello/schema/attribute_registration.rb +47 -0
- data/lib/trello/schema/serializer/default.rb +17 -0
- data/lib/trello/schema/serializer/labels.rb +23 -0
- data/lib/trello/schema/serializer/time.rb +25 -0
- data/lib/trello/schema/serializer/webhooks.rb +25 -0
- data/lib/trello/token.rb +15 -12
- data/lib/trello/webhook.rb +18 -71
- data/spec/action_spec.rb +1 -2
- data/spec/board_spec.rb +43 -103
- data/spec/card_spec.rb +51 -50
- data/spec/cassettes/action_find_with_id_and_get_all_fields.yml +104 -0
- data/spec/cassettes/board_find_with_id_and_get_all_fields.yml +96 -0
- data/spec/cassettes/board_find_with_id_and_get_specific_fields.yml +96 -0
- data/spec/cassettes/can_add_a_member_to_a_board.yml +191 -0
- data/spec/cassettes/can_arvhice_all_cards_of_list.yml +397 -0
- data/spec/cassettes/can_get_actions_of_board.yml +188 -0
- data/spec/cassettes/can_get_actions_of_list.yml +202 -0
- data/spec/cassettes/can_get_actions_of_members.yml +199 -0
- data/spec/cassettes/can_get_actions_of_organization.yml +201 -0
- data/spec/cassettes/can_get_boards_of_custom_field.yml +198 -0
- data/spec/cassettes/can_get_boards_of_label.yml +197 -0
- data/spec/cassettes/can_get_boards_of_organization.yml +207 -0
- data/spec/cassettes/can_get_cards_of_board.yml +193 -0
- data/spec/cassettes/can_get_cards_of_list.yml +201 -0
- data/spec/cassettes/can_get_cards_of_member.yml +204 -0
- data/spec/cassettes/can_get_checklists_of_board.yml +187 -0
- data/spec/cassettes/can_get_custom_field_options_of_custom_field.yml +197 -0
- data/spec/cassettes/can_get_custom_fields_of_board.yml +187 -0
- data/spec/cassettes/can_get_label_names_of_board.yml +187 -0
- data/spec/cassettes/can_get_labels_of_board.yml +187 -0
- data/spec/cassettes/can_get_lists_of_board.yml +187 -0
- data/spec/cassettes/can_get_members_of_board.yml +188 -0
- data/spec/cassettes/can_get_members_of_organization.yml +200 -0
- data/spec/cassettes/can_get_notifications_of_member.yml +199 -0
- data/spec/cassettes/can_get_organization_of_board.yml +189 -0
- data/spec/cassettes/can_get_organizations_of_member.yml +203 -0
- data/spec/cassettes/can_get_plugin_data_of_board.yml +187 -0
- data/spec/cassettes/can_move_all_cards_to_another_list.yml +886 -0
- data/spec/cassettes/can_success_create_a_board.yml +98 -0
- data/spec/cassettes/can_success_create_a_board_with_full_parameters.yml +97 -0
- data/spec/cassettes/can_success_create_a_board_without_clone_from_other.yml +98 -0
- data/spec/cassettes/can_success_create_a_card_when_due_is_datetime.yml +98 -0
- data/spec/cassettes/can_success_create_a_card_when_due_is_time.yml +98 -0
- data/spec/cassettes/can_success_create_a_checklist.yml +102 -0
- data/spec/cassettes/can_success_create_a_custom_field.yml +102 -0
- data/spec/cassettes/can_success_create_a_custom_field_option.yml +102 -0
- data/spec/cassettes/can_success_create_a_label.yml +102 -0
- data/spec/cassettes/can_success_create_a_list.yml +102 -0
- data/spec/cassettes/can_success_create_a_list_with_full_parameters.yml +102 -0
- data/spec/cassettes/can_success_create_a_organization.yml +104 -0
- data/spec/cassettes/can_success_create_a_webhook.yml +102 -0
- data/spec/cassettes/can_success_delete_a_custom_field_option.yml +389 -0
- data/spec/cassettes/can_success_delete_checklist.yml +284 -0
- data/spec/cassettes/can_success_get_card_of_board_by_card_id.yml +188 -0
- data/spec/cassettes/can_success_remove_member_from_board.yml +186 -0
- data/spec/cassettes/can_success_return_all_boards_of_current_user.yml +195 -0
- data/spec/cassettes/can_success_upate_a_board.yml +191 -0
- data/spec/cassettes/can_success_upate_a_list.yml +296 -0
- data/spec/cassettes/can_success_update_bong_a_board.yml +39 -39
- data/spec/cassettes/can_success_update_bong_a_board_with_specific_fields.yml +284 -0
- data/spec/cassettes/can_success_update_bong_a_checklist_with_specific_fields.yml +296 -0
- data/spec/cassettes/can_success_update_bong_a_custom_field.yml +200 -0
- data/spec/cassettes/can_success_update_bong_a_label.yml +200 -0
- data/spec/cassettes/can_success_update_bong_a_list.yml +199 -0
- data/spec/cassettes/can_success_update_bong_a_list_with_specific_fields.yml +296 -0
- data/spec/cassettes/can_success_update_bong_a_organization.yml +203 -0
- data/spec/cassettes/can_success_update_bong_a_webhook.yml +296 -0
- data/spec/cassettes/checklist_can_add_an_item.yml +296 -0
- data/spec/cassettes/checklist_can_update_the_item_state.yml +296 -0
- data/spec/cassettes/checklist_find_with_id_and_get_all_fields.yml +100 -0
- data/spec/cassettes/custom_field_find_with_id_and_get_all_fields.yml +100 -0
- data/spec/cassettes/custom_field_find_with_id_and_get_specific_fields.yml +100 -0
- data/spec/cassettes/custom_field_item_save_1.yml +1 -1
- data/spec/cassettes/custom_field_item_save_2.yml +1 -1
- data/spec/cassettes/custom_field_option_find_with_id.yml +100 -0
- data/spec/cassettes/get_board_of_list.yml +197 -0
- data/spec/cassettes/get_boards_of_member.yml +207 -0
- data/spec/cassettes/label_delete.yml +285 -0
- data/spec/cassettes/label_find_with_id.yml +100 -0
- data/spec/cassettes/list_find_with_id_and_get_all_fields.yml +100 -0
- data/spec/cassettes/list_find_with_id_and_get_specific_fields.yml +100 -0
- data/spec/cassettes/member_find_with_id_and_get_all_fields.yml +101 -0
- data/spec/cassettes/member_find_with_id_and_get_specific_fields.yml +100 -0
- data/spec/cassettes/notification_find_with_id.yml +103 -0
- data/spec/cassettes/organization_find_with_id_and_get_all_fields.yml +102 -0
- data/spec/cassettes/organization_find_with_id_and_get_specific_fields.yml +100 -0
- data/spec/cassettes/token_find_with_token_string.yml +100 -0
- data/spec/cassettes/webhook_delete.yml +286 -0
- data/spec/cassettes/webhook_find_with_id.yml +100 -0
- data/spec/checklist_spec.rb +27 -43
- data/spec/custom_field_item_spec.rb +2 -2
- data/spec/custom_field_option_spec.rb +2 -2
- data/spec/custom_field_spec.rb +25 -13
- data/spec/integration/action/find_spec.rb +23 -0
- data/spec/integration/basic_data/many_spec.rb +4 -0
- data/spec/integration/basic_data/schema_spec.rb +156 -0
- data/spec/integration/board/add_member_spec.rb +21 -0
- data/spec/integration/board/all_spec.rb +20 -0
- data/spec/integration/board/associations/actions_spec.rb +18 -0
- data/spec/integration/board/associations/cards_spec.rb +18 -0
- data/spec/integration/board/associations/checklists_spec.rb +18 -0
- data/spec/integration/board/associations/custom_fields_spec.rb +18 -0
- data/spec/integration/board/associations/label_names_spec.rb +17 -0
- data/spec/integration/board/associations/labels_spec.rb +18 -0
- data/spec/integration/board/associations/lists_spec.rb +18 -0
- data/spec/integration/board/associations/members_spec.rb +18 -0
- data/spec/integration/board/associations/organization_spec.rb +19 -0
- data/spec/integration/board/associations/plugin_data_spec.rb +18 -0
- data/spec/integration/board/create_spec.rb +95 -0
- data/spec/integration/board/find_card_spec.rb +18 -0
- data/spec/integration/board/find_spec.rb +42 -0
- data/spec/integration/board/remove_member_spec.rb +21 -0
- data/spec/integration/board/save_spec.rb +37 -0
- data/spec/integration/board/update!_spec.rb +33 -2
- data/spec/integration/card/associations/plugin_data_spec.rb +1 -1
- data/spec/integration/card/create_spec.rb +36 -2
- data/spec/integration/card/find_spec.rb +1 -1
- data/spec/integration/card/save_spec.rb +2 -2
- data/spec/integration/checklist/add_item_spec.rb +20 -0
- data/spec/integration/checklist/create_spec.rb +23 -0
- data/spec/integration/checklist/delete_spec.rb +17 -0
- data/spec/integration/checklist/find_spec.rb +22 -0
- data/spec/integration/checklist/update!_spec.rb +21 -0
- data/spec/integration/checklist/update_item_state_spec.rb +20 -0
- data/spec/integration/custom_field/association/board_spec.rb +18 -0
- data/spec/integration/custom_field/association/custom_field_options_spec.rb +18 -0
- data/spec/integration/custom_field/create_spec.rb +29 -0
- data/spec/integration/custom_field/find_spec.rb +41 -0
- data/spec/integration/custom_field/update!_spec.rb +25 -0
- data/spec/integration/custom_field_option/create_spec.rb +23 -0
- data/spec/integration/custom_field_option/delete_spec.rb +19 -0
- data/spec/integration/custom_field_option/find_spec.rb +21 -0
- data/spec/integration/label/association/board_spec.rb +18 -0
- data/spec/integration/label/create_spec.rb +23 -0
- data/spec/integration/label/delete_spec.rb +21 -0
- data/spec/integration/label/find_spec.rb +20 -0
- data/spec/integration/label/update!_spec.rb +25 -0
- data/spec/integration/list/archive_all_cards_spec.rb +20 -0
- data/spec/integration/list/associations/actions_spec.rb +18 -0
- data/spec/integration/list/associations/board_spec.rb +18 -0
- data/spec/integration/list/associations/cards_spec.rb +18 -0
- data/spec/integration/list/create_spec.rb +44 -0
- data/spec/integration/list/find_spec.rb +37 -0
- data/spec/integration/list/move_all_cards_spec.rb +31 -0
- data/spec/integration/list/save_spec.rb +40 -0
- data/spec/integration/list/update!_spec.rb +43 -0
- data/spec/integration/member/associations/actions_spec.rb +17 -0
- data/spec/integration/member/associations/boards_spec.rb +18 -0
- data/spec/integration/member/associations/cards_spec.rb +18 -0
- data/spec/integration/member/associations/notifications_spec.rb +18 -0
- data/spec/integration/member/associations/organizations_spec.rb +18 -0
- data/spec/integration/member/find_spec.rb +39 -0
- data/spec/integration/member/update!_spec.rb +18 -0
- data/spec/integration/notification/find_spec.rb +27 -0
- data/spec/integration/organization/associations/actions_spec.rb +18 -0
- data/spec/integration/organization/associations/boards_spec.rb +18 -0
- data/spec/integration/organization/associations/members_spec.rb +18 -0
- data/spec/integration/organization/create_spec.rb +23 -0
- data/spec/integration/organization/find_spec.rb +37 -0
- data/spec/integration/organization/update!_spec.rb +28 -0
- data/spec/integration/token/find_spec.rb +24 -0
- data/spec/integration/webhook/create_spec.rb +27 -0
- data/spec/integration/webhook/delete_spec.rb +21 -0
- data/spec/integration/webhook/find_spec.rb +22 -0
- data/spec/integration/webhook/update!_spec.rb +24 -0
- data/spec/item_spec.rb +2 -2
- data/spec/label_spec.rb +31 -33
- data/spec/list_spec.rb +32 -14
- data/spec/notification_spec.rb +3 -3
- data/spec/organization_spec.rb +6 -5
- data/spec/spec_helper.rb +22 -14
- data/spec/token_spec.rb +10 -11
- data/spec/unit/trello/basic_data_spec.rb +67 -8
- data/spec/unit/trello/board/new_spec.rb +370 -0
- data/spec/unit/trello/board/save_spec.rb +49 -0
- data/spec/unit/trello/board/update_fields_spec.rb +129 -0
- data/spec/unit/trello/board/update_spec.rb +197 -0
- data/spec/unit/trello/member/new_spec.rb +62 -0
- data/spec/unit/trello/member/update_fields_spec.rb +80 -0
- data/spec/unit/trello/schema/attribute/base_spec.rb +349 -0
- data/spec/unit/trello/schema/attribute/board_pref_spec.rb +208 -0
- data/spec/unit/trello/schema/attribute/default_spec.rb +236 -0
- data/spec/unit/trello/schema/attribute_builder_spec.rb +55 -0
- data/spec/unit/trello/schema/attribute_registration_spec.rb +59 -0
- data/spec/unit/trello/schema/serializer/default_spec.rb +19 -0
- data/spec/unit/trello/schema/serializer/time_spec.rb +39 -0
- data/spec/unit/trello/schema_spec.rb +25 -0
- data/spec/webhook_spec.rb +23 -7
- metadata +422 -102
- data/lib/trello/register_attributes.rb +0 -54
- data/spec/integration/basic_data/register_attributes_spec.rb +0 -75
@@ -0,0 +1,208 @@
|
|
1
|
+
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
RSpec.describe 'Trello::Schema::Attribute::BoardPref' do
|
5
|
+
|
6
|
+
let(:attribute) { Trello::Schema::Attribute::BoardPref.new(name: name, options: options, serializer: serializer) }
|
7
|
+
|
8
|
+
describe '#build_attributes' do
|
9
|
+
let(:name) { :visibility_level }
|
10
|
+
let(:options) { { remote_key: :permissionLevel } }
|
11
|
+
let(:serializer) { double('serializer') }
|
12
|
+
let(:default) { nil }
|
13
|
+
|
14
|
+
before do
|
15
|
+
allow(serializer)
|
16
|
+
.to receive(:deserialize)
|
17
|
+
.with(raw_value, default)
|
18
|
+
.and_return(deserialize_result)
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:build_attributes) { attribute.build_attributes(params, attributes) }
|
22
|
+
let(:attributes) { { name: 'John' } }
|
23
|
+
|
24
|
+
context 'when prefs and name key are both missing' do
|
25
|
+
let(:raw_value) { nil }
|
26
|
+
let(:deserialize_result) { nil }
|
27
|
+
let(:params) { {} }
|
28
|
+
|
29
|
+
it 'deserialize and set the attribute to nil' do
|
30
|
+
expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: nil })
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "when params's key prefs exits" do
|
35
|
+
context 'and target key is missing' do
|
36
|
+
let(:raw_value) { nil }
|
37
|
+
let(:deserialize_result) { nil }
|
38
|
+
let(:params) { { 'prefs' => {} } }
|
39
|
+
|
40
|
+
it 'deserialize and set the attribute to nil' do
|
41
|
+
expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: nil })
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'and target value is nil' do
|
46
|
+
let(:raw_value) { nil }
|
47
|
+
let(:deserialize_result) { nil }
|
48
|
+
let(:params) { { 'prefs' => { 'permissionLevel' => nil } } }
|
49
|
+
|
50
|
+
it 'deserialize and set the attribute to nil' do
|
51
|
+
expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: nil })
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'and target value is false' do
|
56
|
+
let(:raw_value) { false }
|
57
|
+
let(:deserialize_result) { false }
|
58
|
+
let(:params) { { 'prefs' => { 'permissionLevel' => false } } }
|
59
|
+
|
60
|
+
it 'deserialize and set the attribute to false' do
|
61
|
+
expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: false })
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'and target value is not nil or false' do
|
66
|
+
let(:raw_value) { 'org' }
|
67
|
+
let(:deserialize_result) { 'org' }
|
68
|
+
let(:params) { { 'prefs' => { 'permissionLevel' => 'org' } } }
|
69
|
+
|
70
|
+
it 'deserialize and set the attribute' do
|
71
|
+
expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: 'org' })
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context "when params's key prefs does not exits" do
|
77
|
+
context 'and target value is nil' do
|
78
|
+
let(:raw_value) { nil }
|
79
|
+
let(:deserialize_result) { nil }
|
80
|
+
let(:params) { { visibility_level: nil } }
|
81
|
+
|
82
|
+
it 'get and deserialize that value and set to attributes with symbolize name' do
|
83
|
+
expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: nil })
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'and target value is false' do
|
88
|
+
let(:raw_value) { false }
|
89
|
+
let(:deserialize_result) { false }
|
90
|
+
let(:params) { { visibility_level: false } }
|
91
|
+
|
92
|
+
it 'get and deserialize that value and set to attributes with symbolize name' do
|
93
|
+
expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: false })
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'and target value is not nil or false ' do
|
98
|
+
let(:raw_value) { 'org' }
|
99
|
+
let(:deserialize_result) { 'org' }
|
100
|
+
let(:params) { { visibility_level: 'org' } }
|
101
|
+
|
102
|
+
it 'get and deserialize that value and set to attributes with symbolize name' do
|
103
|
+
expect(build_attributes).to match_hash_with_indifferent_access({ name: 'John', visibility_level: 'org' })
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe '#build_payload_for_create' do
|
110
|
+
let(:name) { :visibility_level }
|
111
|
+
let(:options) { { remote_key: :permissionLevel } }
|
112
|
+
let(:serializer) { double('serializer') }
|
113
|
+
let(:default) { nil }
|
114
|
+
|
115
|
+
before do
|
116
|
+
allow(serializer)
|
117
|
+
.to receive(:serialize)
|
118
|
+
.with('org')
|
119
|
+
.and_return('org')
|
120
|
+
end
|
121
|
+
|
122
|
+
let(:build_attributes) { attribute.build_payload_for_create(attributes, payload) }
|
123
|
+
let(:payload) { { 'name' => 'John' } }
|
124
|
+
|
125
|
+
|
126
|
+
context 'when attribute is for action create' do
|
127
|
+
|
128
|
+
context 'when attribute value is nil' do
|
129
|
+
let(:attributes) { { visibility_level: nil } }
|
130
|
+
|
131
|
+
it "won't put it in payload" do
|
132
|
+
expect(build_attributes).to eq({ 'name' => 'John' })
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
context 'when attributes does not contain the attribute key' do
|
137
|
+
let(:attributes) { {} }
|
138
|
+
|
139
|
+
it "won't put it in payload" do
|
140
|
+
expect(build_attributes).to eq({ 'name' => 'John' })
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context 'when attribute value is normal' do
|
145
|
+
let(:attributes) { { visibility_level: 'org' } }
|
146
|
+
|
147
|
+
it 'get and serialize that value and set to payload with stringify name' do
|
148
|
+
expect(build_attributes).to eq({ 'name' => 'John', 'prefs_permissionLevel' => 'org' })
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
context 'when attribute is not for action create' do
|
154
|
+
let(:options) { { remote_key: :permissionLevel, update_only: true } }
|
155
|
+
let(:attributes) { { visibility_level: 'org' } }
|
156
|
+
|
157
|
+
it "won't put it in payload" do
|
158
|
+
expect(build_attributes).to eq({ 'name' => 'John' })
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
describe '#build_payload_for_update' do
|
164
|
+
let(:name) { :visibility_level }
|
165
|
+
let(:serializer) { double('serializer') }
|
166
|
+
let(:default) { nil }
|
167
|
+
|
168
|
+
before do
|
169
|
+
allow(serializer)
|
170
|
+
.to receive(:serialize)
|
171
|
+
.with('org')
|
172
|
+
.and_return('org')
|
173
|
+
end
|
174
|
+
|
175
|
+
let(:build_attributes) { attribute.build_payload_for_update(attributes, payload) }
|
176
|
+
let(:payload) { { 'name' => 'John' } }
|
177
|
+
|
178
|
+
context 'when attribute is for action create' do
|
179
|
+
let(:options) { { remote_key: :permissionLevel } }
|
180
|
+
|
181
|
+
context 'when attributes does not contain the attribute key' do
|
182
|
+
let(:attributes) { {} }
|
183
|
+
|
184
|
+
it "won't put it in payload" do
|
185
|
+
expect(build_attributes).to eq({ 'name' => 'John' })
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
context 'when attribute value is normal' do
|
190
|
+
let(:attributes) { { visibility_level: 'org' } }
|
191
|
+
|
192
|
+
it 'get and serialize that value and set to payload with stringify name' do
|
193
|
+
expect(build_attributes).to eq({ 'name' => 'John', 'prefs/permissionLevel' => 'org' })
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
context 'when attribute is not for action update' do
|
199
|
+
let(:options) { { remote_key: :permissionLevel, create_only: true } }
|
200
|
+
let(:attributes) { { visibility_level: 'org' } }
|
201
|
+
|
202
|
+
it "won't put it in payload" do
|
203
|
+
expect(build_attributes).to eq({ 'name' => 'John' })
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
end
|
@@ -0,0 +1,236 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe 'Trello::Schema::Attribute::Default' do
|
4
|
+
|
5
|
+
let(:attribute) { Trello::Schema::Attribute::Default.new(name: name, options: options, serializer: serializer) }
|
6
|
+
|
7
|
+
describe '#build_attributes' do
|
8
|
+
let(:name) { :date_create_utc }
|
9
|
+
let(:options) { { remote_key: 'dateCreateUTC' } }
|
10
|
+
let(:serializer) { double('serializer') }
|
11
|
+
let(:default) { nil }
|
12
|
+
|
13
|
+
before do
|
14
|
+
allow(serializer)
|
15
|
+
.to receive(:deserialize)
|
16
|
+
.with(raw_value, default)
|
17
|
+
.and_return(deserialize_result)
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:build_attributes) { attribute.build_attributes(params, attributes) }
|
21
|
+
let(:attributes) { { name: 'John' } }
|
22
|
+
|
23
|
+
context 'when target key in params is string' do
|
24
|
+
let(:raw_value) { '2020-02-20 00:00:00' }
|
25
|
+
let(:deserialize_result) { Time.new(2020, 2, 20) }
|
26
|
+
let(:params) { { 'date_create_utc' => raw_value } }
|
27
|
+
|
28
|
+
it 'get and deserialize that value and set to attributes' do
|
29
|
+
expect(build_attributes).to match_hash_with_indifferent_access(
|
30
|
+
{ name: 'John', date_create_utc: Time.new(2020, 2, 20) }
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when target key in params is symbol' do
|
36
|
+
let(:raw_value) { '2020-02-20 00:00:00' }
|
37
|
+
let(:deserialize_result) { Time.new(2020, 2, 20) }
|
38
|
+
let(:params) { { date_create_utc: raw_value } }
|
39
|
+
|
40
|
+
it 'get and deserialize that value and set to attributes' do
|
41
|
+
expect(build_attributes).to match_hash_with_indifferent_access(
|
42
|
+
{ name: 'John', date_create_utc: Time.new(2020, 2, 20) }
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when value under remote_key is nil' do
|
48
|
+
let(:raw_value) { nil }
|
49
|
+
let(:deserialize_result) { nil }
|
50
|
+
let(:params) { { 'dateCreateUTC': raw_value } }
|
51
|
+
|
52
|
+
it 'get and deserialize that value and set to attributes' do
|
53
|
+
expect(build_attributes).to match_hash_with_indifferent_access(
|
54
|
+
{ name: 'John', date_create_utc: nil }
|
55
|
+
)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'when value under name key is nil' do
|
60
|
+
let(:raw_value) { nil }
|
61
|
+
let(:deserialize_result) { nil }
|
62
|
+
let(:params) { { date_create_utc: raw_value } }
|
63
|
+
|
64
|
+
it 'get and deserialize that value and set to attributes' do
|
65
|
+
expect(build_attributes).to match_hash_with_indifferent_access(
|
66
|
+
{ name: 'John', date_create_utc: nil }
|
67
|
+
)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'when value under remote_key is false' do
|
72
|
+
let(:raw_value) { false }
|
73
|
+
let(:deserialize_result) { false }
|
74
|
+
let(:params) { { 'dateCreateUTC': raw_value } }
|
75
|
+
|
76
|
+
it 'get and deserialize that value and set to attributes' do
|
77
|
+
expect(build_attributes).to match_hash_with_indifferent_access(
|
78
|
+
{ name: 'John', date_create_utc: false }
|
79
|
+
)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
describe '#build_pending_update_attributes' do
|
86
|
+
let(:name) { :date_create_utc }
|
87
|
+
let(:options) { { remote_key: 'dateCreateUTC' } }
|
88
|
+
let(:serializer) { double('serializer') }
|
89
|
+
let(:default) { nil }
|
90
|
+
|
91
|
+
before do
|
92
|
+
allow(serializer)
|
93
|
+
.to receive(:deserialize)
|
94
|
+
.with(raw_value, default)
|
95
|
+
.and_return(deserialize_result)
|
96
|
+
end
|
97
|
+
|
98
|
+
let(:build_pending_update_attributes) { attribute.build_pending_update_attributes(params, attributes) }
|
99
|
+
let(:attributes) { { name: 'John' } }
|
100
|
+
|
101
|
+
context 'when remote_key and target key is missing' do
|
102
|
+
let(:raw_value) { false }
|
103
|
+
let(:deserialize_result) { false }
|
104
|
+
let(:params) { {} }
|
105
|
+
|
106
|
+
it "won't set any value to pending update attributes" do
|
107
|
+
expect(build_pending_update_attributes).to match_hash_with_indifferent_access({ name: 'John' })
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'when remote_key exists' do
|
112
|
+
let(:raw_value) { false }
|
113
|
+
let(:deserialize_result) { false }
|
114
|
+
let(:params) { { 'dateCreateUTC': raw_value } }
|
115
|
+
|
116
|
+
it 'will set the value to pending update attributes' do
|
117
|
+
expect(build_pending_update_attributes).to match_hash_with_indifferent_access(
|
118
|
+
{ name: 'John', date_create_utc: raw_value }
|
119
|
+
)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'when target key exists' do
|
124
|
+
let(:raw_value) { false }
|
125
|
+
let(:deserialize_result) { false }
|
126
|
+
let(:params) { { date_create_utc: raw_value } }
|
127
|
+
|
128
|
+
it 'will set the value to pending update attributes' do
|
129
|
+
expect(build_pending_update_attributes).to match_hash_with_indifferent_access(
|
130
|
+
{ name: 'John', date_create_utc: raw_value }
|
131
|
+
)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
describe '#build_payload_for_create' do
|
138
|
+
let(:name) { :date_create_utc }
|
139
|
+
let(:serializer) { double('serializer') }
|
140
|
+
let(:default) { nil }
|
141
|
+
|
142
|
+
before do
|
143
|
+
allow(serializer)
|
144
|
+
.to receive(:serialize)
|
145
|
+
.with(Time.new(2020, 2, 20))
|
146
|
+
.and_return('2020-02-20 00:00:00')
|
147
|
+
end
|
148
|
+
|
149
|
+
let(:build_attributes) { attribute.build_payload_for_create(attributes, payload) }
|
150
|
+
let(:payload) { { 'name' => 'John' } }
|
151
|
+
|
152
|
+
|
153
|
+
context 'when attribute is for action create' do
|
154
|
+
let(:options) { {} }
|
155
|
+
|
156
|
+
context 'when attribute value is nil' do
|
157
|
+
let(:attributes) { { date_create_utc: nil } }
|
158
|
+
|
159
|
+
it "won't put it in payload" do
|
160
|
+
expect(build_attributes).to eq({ 'name' => 'John' })
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
context 'when attributes does not contain the attribute key' do
|
165
|
+
let(:attributes) { {} }
|
166
|
+
|
167
|
+
it "won't put it in payload" do
|
168
|
+
expect(build_attributes).to eq({ 'name' => 'John' })
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
context 'when attribute value is normal' do
|
173
|
+
let(:attributes) { { date_create_utc: Time.new(2020, 2, 20) } }
|
174
|
+
|
175
|
+
it 'get and serialize that value and set to payload with stringify name' do
|
176
|
+
expect(build_attributes).to eq({ 'name' => 'John', 'date_create_utc' => '2020-02-20 00:00:00' })
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
context 'when attribute is not for action create' do
|
182
|
+
let(:options) { { update_only: true } }
|
183
|
+
let(:attributes) { { date_create_utc: Time.new(2020, 2, 20) } }
|
184
|
+
|
185
|
+
it "won't put it in payload" do
|
186
|
+
expect(build_attributes).to eq({ 'name' => 'John' })
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
describe '#build_payload_for_update' do
|
192
|
+
let(:name) { :date_create_utc }
|
193
|
+
let(:serializer) { double('serializer') }
|
194
|
+
let(:default) { nil }
|
195
|
+
|
196
|
+
before do
|
197
|
+
allow(serializer)
|
198
|
+
.to receive(:serialize)
|
199
|
+
.with(Time.new(2020, 2, 20))
|
200
|
+
.and_return('2020-02-20 00:00:00')
|
201
|
+
end
|
202
|
+
|
203
|
+
let(:build_attributes) { attribute.build_payload_for_update(attributes, payload) }
|
204
|
+
let(:payload) { { 'name' => 'John' } }
|
205
|
+
|
206
|
+
context 'when attribute is for action create' do
|
207
|
+
let(:options) { {} }
|
208
|
+
|
209
|
+
context 'when attributes does not contain the attribute key' do
|
210
|
+
let(:attributes) { {} }
|
211
|
+
|
212
|
+
it "won't put it in payload" do
|
213
|
+
expect(build_attributes).to eq({ 'name' => 'John' })
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
context 'when attribute value is normal' do
|
218
|
+
let(:attributes) { { date_create_utc: Time.new(2020, 2, 20) } }
|
219
|
+
|
220
|
+
it 'get and serialize that value and set to payload with stringify name' do
|
221
|
+
expect(build_attributes).to eq({ 'name' => 'John', 'date_create_utc' => '2020-02-20 00:00:00' })
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
context 'when attribute is not for action create' do
|
227
|
+
let(:options) { { create_only: true } }
|
228
|
+
let(:attributes) { { date_create_utc: Time.new(2020, 2, 20) } }
|
229
|
+
|
230
|
+
it "won't put it in payload" do
|
231
|
+
expect(build_attributes).to eq({ 'name' => 'John' })
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Trello::Schema::AttributeBuilder do
|
4
|
+
|
5
|
+
describe '.build' do
|
6
|
+
context 'when does not pass class_name and serializer' do
|
7
|
+
let(:build_attribute) { Trello::Schema::AttributeBuilder.build(:name, { readonly: true }) }
|
8
|
+
let(:attribute) { double('attribute') }
|
9
|
+
|
10
|
+
it 'use Schema::Attribute::Default to initialize with Schema::Serializer::Default' do
|
11
|
+
expect(Schema::Attribute::Default)
|
12
|
+
.to receive(:new)
|
13
|
+
.with(name: :name, options: { readonly: true }, serializer: Schema::Serializer::Default)
|
14
|
+
.and_return(attribute)
|
15
|
+
|
16
|
+
expect(build_attribute).to eq(attribute)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when does pass class_name and serializer' do
|
21
|
+
let(:build_attribute) { Trello::Schema::AttributeBuilder.build(:name, { readonly: true, class_name: 'CustomAttribute', serializer: 'CustomSerializer' }) }
|
22
|
+
let(:attribute) { double('attribute') }
|
23
|
+
|
24
|
+
around do |example|
|
25
|
+
module Trello
|
26
|
+
class Schema
|
27
|
+
module Attribute
|
28
|
+
class CustomAttribute
|
29
|
+
end
|
30
|
+
end
|
31
|
+
module Serializer
|
32
|
+
class CustomSerializer
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
example.run
|
39
|
+
|
40
|
+
Trello::Schema::Attribute.send(:remove_const, 'CustomAttribute')
|
41
|
+
Trello::Schema::Serializer.send(:remove_const, 'CustomSerializer')
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'use passin class to initializer with passin serializer' do
|
45
|
+
expect(Schema::Attribute::CustomAttribute)
|
46
|
+
.to receive(:new)
|
47
|
+
.with(name: :name, options: { readonly: true }, serializer: Schema::Serializer::CustomSerializer)
|
48
|
+
.and_return(attribute)
|
49
|
+
|
50
|
+
expect(build_attribute).to eq(attribute)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|