ruby-trello 2.3.1 → 3.2.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 +49 -23
- 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/client.rb +1 -1
- data/lib/trello/comment.rb +39 -26
- data/lib/trello/configuration.rb +8 -0
- 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 +11 -5
- 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/net/faraday.rb +46 -0
- data/lib/trello/net/rest_client.rb +41 -0
- data/lib/trello/net.rb +1 -28
- 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/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/schema.rb +31 -0
- data/lib/trello/token.rb +15 -12
- data/lib/trello/webhook.rb +18 -71
- data/lib/trello.rb +62 -7
- 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_comments_board.yml +109 -0
- data/spec/cassettes/can_get_comments_card.yml +111 -0
- data/spec/cassettes/can_get_comments_list.yml +109 -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/comment_delete.yml +331 -0
- data/spec/cassettes/comment_find_with_id.yml +116 -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/client_spec.rb +57 -3
- data/spec/configuration_spec.rb +13 -0
- 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 +20 -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/delete_spec.rb +2 -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/comment/association/board_spec.rb +17 -0
- data/spec/integration/comment/association/card_spec.rb +17 -0
- data/spec/integration/comment/association/list_spec.rb +17 -0
- data/spec/integration/comment/delete_spec.rb +20 -0
- data/spec/integration/comment/find_spec.rb +17 -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/integration_test.rb +3 -3
- 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 +31 -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 +444 -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
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Trello::Schema::AttributeRegistration do
|
4
|
+
|
5
|
+
around do |example|
|
6
|
+
module Trello
|
7
|
+
class FakeBoard < BasicData
|
8
|
+
def initialize; end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
example.run
|
13
|
+
|
14
|
+
Trello.send(:remove_const, 'FakeBoard')
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:attribute) { Trello::Schema::Attribute::Base.new(
|
18
|
+
name: name,
|
19
|
+
options: options,
|
20
|
+
serializer: serializer
|
21
|
+
) }
|
22
|
+
|
23
|
+
context 'when it is a writable attribute' do
|
24
|
+
let(:name) { :name }
|
25
|
+
let(:serializer) { double('serializer') }
|
26
|
+
let(:options) { nil }
|
27
|
+
|
28
|
+
it 'create getter method for the attribute' do
|
29
|
+
Trello::Schema::AttributeRegistration.register(Trello::FakeBoard, attribute)
|
30
|
+
|
31
|
+
expect(Trello::FakeBoard.new).to respond_to(:name)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'create setter method for the attribute' do
|
35
|
+
Trello::Schema::AttributeRegistration.register(Trello::FakeBoard, attribute)
|
36
|
+
|
37
|
+
expect(Trello::FakeBoard.new).to respond_to(:name=)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'when it is a readonly attribute' do
|
42
|
+
let(:name) { :name }
|
43
|
+
let(:serializer) { double('serializer') }
|
44
|
+
let(:options) { { readonly: true } }
|
45
|
+
|
46
|
+
it 'create getter method for the attribute' do
|
47
|
+
Trello::Schema::AttributeRegistration.register(Trello::FakeBoard, attribute)
|
48
|
+
|
49
|
+
expect(Trello::FakeBoard.new).to respond_to(:name)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "won't create setter method for the attribute" do
|
53
|
+
Trello::Schema::AttributeRegistration.register(Trello::FakeBoard, attribute)
|
54
|
+
|
55
|
+
expect(Trello::FakeBoard.new).not_to respond_to(:name=)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe 'Trello::Schema::Serializer::Default' do
|
4
|
+
|
5
|
+
describe '.serialize' do
|
6
|
+
it 'directly return the value' do
|
7
|
+
expect(Trello::Schema::Serializer::Default.serialize('John')).to eq('John')
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '.deserialize' do
|
12
|
+
it 'directly return the value' do
|
13
|
+
expect(Trello::Schema::Serializer::Default.deserialize('John', nil)).to eq('John')
|
14
|
+
expect(Trello::Schema::Serializer::Default.deserialize(nil, 'John')).to eq('John')
|
15
|
+
expect(Trello::Schema::Serializer::Default.deserialize(false, 'John')).to eq(false)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe 'Trello::Schema::Serializer::Time' do
|
4
|
+
|
5
|
+
describe '.serialize' do
|
6
|
+
it 'parse the time to string with format like: 2020-01-01T00:00:00.000Z' do
|
7
|
+
expect(Trello::Schema::Serializer::Time.serialize(Time.new(2020, 4, 13, 23, 12, 59))).to eq('2020-04-13T23:12:59.000Z')
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '.deserialize' do
|
12
|
+
context 'when pass in time string' do
|
13
|
+
it 'parset it to a time' do
|
14
|
+
expect(Trello::Schema::Serializer::Time.deserialize('2020-04-13T23:12:59.000Z', nil)).to eq(Time.new(2020, 4, 13, 23, 12, 59))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when pass in a time' do
|
19
|
+
it 'return the time' do
|
20
|
+
expect(Trello::Schema::Serializer::Time.deserialize(Time.new(2020, 4, 13, 23, 12, 59), nil)).to eq(Time.new(2020, 4, 13, 23, 12, 59))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when pass in a object respond to :to_time. i.e. Date, DateTime ...' do
|
25
|
+
it 'convert it to time' do
|
26
|
+
expect(Trello::Schema::Serializer::Time.deserialize(Date.new(2020, 4, 13), nil)).to eq(Time.new(2020, 4, 13))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'when pass in a invalid value' do
|
31
|
+
it 'return the default value' do
|
32
|
+
expect(Trello::Schema::Serializer::Time.deserialize('abc', nil)).to eq(nil)
|
33
|
+
expect(Trello::Schema::Serializer::Time.deserialize('abc', Time.new(2020, 1, 1))).to eq(Time.new(2020, 1, 1))
|
34
|
+
expect(Trello::Schema::Serializer::Time.deserialize(nil, Time.new(2020, 1, 1))).to eq(Time.new(2020, 1, 1))
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Trello::Schema do
|
4
|
+
|
5
|
+
describe '#attribute' do
|
6
|
+
let(:schema) { Trello::Schema.new }
|
7
|
+
|
8
|
+
it 'record attribute to attrs' do
|
9
|
+
attribute_1 = double('Trello::Schema::Attribute::Default')
|
10
|
+
attribute_2 = double('Trello::Schema::Attribute::Default')
|
11
|
+
|
12
|
+
expect(Trello::Schema::AttributeBuilder).to receive(:build).with(:id, readonly: true).and_return(attribute_1)
|
13
|
+
expect(Trello::Schema::AttributeBuilder).to receive(:build).with(:name, {}).and_return(attribute_2)
|
14
|
+
|
15
|
+
schema.attribute(:id, readonly: true)
|
16
|
+
schema.attribute(:name)
|
17
|
+
|
18
|
+
expect(schema.attrs).to be_a(Hash)
|
19
|
+
expect(schema.attrs.count).to eq(2)
|
20
|
+
expect(schema.attrs[:id]).to eq(attribute_1)
|
21
|
+
expect(schema.attrs[:name]).to eq(attribute_2)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|