Skip to content

Commit 004efab

Browse files
committed
Adjust JSON data generator in Events API tests
1 parent 8a8b327 commit 004efab

18 files changed

+366
-366
lines changed

bolt-servlet/src/test/java/test_with_remote_apis/sample_json_generation/EventDataRecorder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,11 @@ public void writeMergedJsonData(String payloadClassName, String body) throws IOE
9696
for (Map.Entry<String, JsonElement> entry : jsonObj.entrySet()) {
9797
scanToNormalizeValues(jsonObj, entry.getKey(), entry.getValue());
9898
}
99+
JsonElement eventContext = jsonElem.getAsJsonObject().get("event_context");
100+
if (eventContext == null) {
101+
// event_context should always exist. But it's not always true in real data.
102+
jsonElem.getAsJsonObject().add("event_context", new JsonPrimitive(""));
103+
}
99104
existingJson = gson().toJson(jsonObj);
100105
Path filePath = new File(toMaskedFilePath(payloadClassName)).toPath();
101106
Files.createDirectories(filePath.getParent());

bolt-servlet/src/test/java/test_with_remote_apis/sample_json_generation/JsonDataRecorder.java

Lines changed: 150 additions & 60 deletions
Large diffs are not rendered by default.

bolt-servlet/src/test/java/test_with_remote_apis/sample_json_generation/JsonDataRecordingListener.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ public void accept(State state) {
4343
JsonDataRecorder recorder = new JsonDataRecorder(state.getConfig(), "../json-logs");
4444
recorder.writeMergedResponse(state.getResponse(), state.getParsedResponseBody());
4545
} catch (IOException e) {
46-
log.error("Failed to write JSON files because {}", e.getMessage(), e);
46+
log.error("Failed to write JSON files because error: {}, body: {}",
47+
e.getMessage(), state.getParsedResponseBody(), e);
4748
} finally {
4849
remaining.remove(bodyPrefix);
4950
log.debug("Finished for `{}` - remaining: {}", bodyPrefix, remaining.size());

bolt-servlet/src/test/java/test_with_remote_apis/sample_json_generation/ObjectInitializer.java

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
package test_with_remote_apis.sample_json_generation;
22

3+
import com.slack.api.model.block.composition.OptionGroupObject;
4+
import com.slack.api.model.block.composition.OptionObject;
35
import lombok.extern.slf4j.Slf4j;
46

57
import java.lang.reflect.Constructor;
68
import java.lang.reflect.Field;
79
import java.lang.reflect.Modifier;
8-
import java.security.SecureRandom;
10+
import java.util.ArrayList;
911
import java.util.List;
1012

13+
import static com.slack.api.model.block.composition.BlockCompositions.asOptions;
14+
import static com.slack.api.model.block.composition.BlockCompositions.plainText;
15+
1116
@Slf4j
1217
public class ObjectInitializer {
1318

14-
private static final SecureRandom RANDOM = new SecureRandom();
15-
1619
private ObjectInitializer() {
1720
}
1821

1922
public static <T> T initProperties(T obj) {
23+
return initProperties(obj, false);
24+
}
25+
26+
public static <T> T initProperties(T obj, boolean attachments) {
2027
Field currentField = null;
2128
try {
2229
for (Field field : obj.getClass().getDeclaredFields()) {
@@ -29,24 +36,8 @@ public static <T> T initProperties(T obj) {
2936
field.setAccessible(true);
3037

3138
Class<?> type = field.getType();
32-
if (field.getName().startsWith("initial")) {
33-
// set as null
34-
} else if (field.getName().startsWith("image")) {
35-
// set as null
36-
} else if (field.getName().equals("fallback")) {
37-
// set as null
38-
} else if (field.getName().equals("url")) {
39-
field.set(obj, "https://www.example.com/test-url");
40-
} else if (field.getName().equals("actionId") && type.equals(String.class)) {
41-
field.set(obj, "action-" + System.currentTimeMillis() + "-" + RANDOM.nextInt(1024));
42-
} else if (field.getName().equals("blockId") && type.equals(String.class)) {
43-
field.set(obj, "block-" + System.currentTimeMillis() + "-" + RANDOM.nextInt(1024));
44-
} else if (field.getName().equals("style") && type.equals(String.class)) {
45-
field.set(obj, "primary");
46-
} else if (field.getName().equals("initialDate") && type.equals(String.class)) {
47-
field.set(obj, "2020-03-11");
48-
} else if (type.equals(String.class)) {
49-
field.set(obj, "str");
39+
if (type.equals(String.class)) {
40+
field.set(obj, "");
5041
} else if (type.equals(Integer.class)) {
5142
field.set(obj, 123);
5243
} else if (type.equals(Long.class)) {
@@ -57,12 +48,38 @@ public static <T> T initProperties(T obj) {
5748
field.set(obj, false);
5849
} else if (type.equals(List.class)) {
5950
List listObj = (List) field.get(obj);
60-
if (listObj != null) {
51+
if (listObj != null && listObj.size() > 0) {
6152
for (Object o : listObj) {
6253
initProperties(o);
6354
}
6455
} else {
65-
log.info("null List object detected {} in {}", field.getName(), obj.getClass().getSimpleName());
56+
if (listObj == null) {
57+
listObj = new ArrayList();
58+
field.set(obj, listObj);
59+
}
60+
if (attachments) {
61+
log.info("null List object detected {} in {}", field.getName(), obj.getClass().getSimpleName());
62+
} else {
63+
if (field.getName().equals("options")) {
64+
listObj.add(initProperties(OptionObject.builder()
65+
.text(plainText(""))
66+
.description(plainText(""))
67+
.build()
68+
));
69+
} else if (field.getName().equals("optionGroups")) {
70+
listObj.add(initProperties(OptionGroupObject.builder()
71+
.label(plainText(""))
72+
.options(asOptions(initProperties(OptionObject.builder()
73+
.text(plainText(""))
74+
.description(plainText(""))
75+
.build()
76+
)))
77+
.build()
78+
));
79+
} else {
80+
log.info("null List object detected {} in {}", field.getName(), obj.getClass().getSimpleName());
81+
}
82+
}
6683
}
6784
} else {
6885
if (field.get(obj) != null) {

bolt-servlet/src/test/java/test_with_remote_apis/sample_json_generation/SampleObjects.java

Lines changed: 142 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
package test_with_remote_apis.sample_json_generation;
22

3+
import com.google.gson.Gson;
34
import com.google.gson.JsonElement;
45
import com.slack.api.model.*;
56
import com.slack.api.model.block.*;
6-
import com.slack.api.model.block.composition.ConfirmationDialogObject;
7-
import com.slack.api.model.block.composition.OptionObject;
8-
import com.slack.api.model.block.composition.PlainTextObject;
9-
import com.slack.api.model.block.composition.TextObject;
7+
import com.slack.api.model.block.composition.*;
108
import com.slack.api.model.block.element.BlockElement;
119
import com.slack.api.model.block.element.ImageElement;
10+
import com.slack.api.model.block.element.PlainTextInputElement;
11+
import com.slack.api.model.block.element.RadioButtonsElement;
1212
import com.slack.api.util.json.GsonFactory;
1313

14-
import java.util.Arrays;
15-
import java.util.HashMap;
16-
import java.util.List;
17-
import java.util.Map;
14+
import java.util.*;
1815

1916
import static com.slack.api.model.block.Blocks.*;
2017
import static com.slack.api.model.block.composition.BlockCompositions.*;
@@ -34,32 +31,57 @@ private Json() {
3431
GsonFactory.createSnakeCase().toJsonTree(SampleObjects.Attachments.get(0))
3532
);
3633

37-
public static List<JsonElement> Blocks = Arrays.asList(
38-
GsonFactory.createSnakeCase().toJsonTree(initProperties(
39-
ActionsBlock.builder().elements(BlockElements).build())),
40-
GsonFactory.createSnakeCase().toJsonTree(initProperties(
41-
ContextBlock.builder().elements(ContextBlockElements).build())),
42-
GsonFactory.createSnakeCase().toJsonTree(initProperties(
43-
DividerBlock.builder().build())),
44-
GsonFactory.createSnakeCase().toJsonTree(initProperties(
45-
ImageBlock.builder().build())),
46-
GsonFactory.createSnakeCase().toJsonTree(initProperties(
34+
private static List<OptionObject> Options = Arrays.asList(initProperties(
35+
OptionObject.builder().text(plainText("")).description(plainText("")).build()
36+
));
37+
private static List<OptionGroupObject> OptionGroups = Arrays.asList(initProperties(
38+
OptionGroupObject.builder().options(Options).label(plainText("")).build()
39+
));
40+
41+
public static List<JsonElement> SectionBlocksWithAccessory = new ArrayList<>();
42+
43+
static {
44+
for (BlockElement element : BlockElements) {
45+
SectionBlocksWithAccessory.add(GsonFactory.createSnakeCase().toJsonTree(initProperties(
4746
SectionBlock.builder()
48-
.accessory(initProperties(ImageElement.builder().build()))
47+
.accessory(element)
4948
.text(TextObject)
5049
.fields(SectionBlockFieldElements)
51-
.build()))
52-
);
50+
.build())));
51+
}
52+
}
53+
54+
public static List<JsonElement> Blocks = initBlocks();
55+
56+
private static List<JsonElement> initBlocks() {
57+
List<JsonElement> blocks = new ArrayList<>();
58+
Gson gson = GsonFactory.createSnakeCase();
59+
blocks.addAll(
60+
Arrays.asList(
61+
gson.toJsonTree(initProperties(ActionsBlock.builder().elements(BlockElements).build())),
62+
gson.toJsonTree(initProperties(ContextBlock.builder().elements(ContextBlockElements).build())),
63+
gson.toJsonTree(initProperties(DividerBlock.builder().build())),
64+
gson.toJsonTree(initProperties(ImageBlock.builder().build()))
65+
)
66+
);
67+
blocks.addAll(SectionBlocksWithAccessory);
68+
return blocks;
69+
}
5370
}
5471

5572
public static List<Attachment> Attachments = Arrays.asList(
5673
initProperties(Attachment.builder()
5774
.fields(Arrays.asList(initProperties(Field.builder().build())))
58-
.actions(Arrays.asList(initProperties(Action.builder()
59-
.optionGroups(Arrays.asList(initProperties(Action.OptionGroup.builder().build())))
60-
.options(Arrays.asList(initProperties(Action.Option.builder().build())))
61-
.selectedOptions(Arrays.asList(initProperties(Action.Option.builder().build())))
62-
.build())))
75+
.actions(Arrays.asList(initProperties(
76+
Action.builder()
77+
.optionGroups(Arrays.asList(initProperties(Action.OptionGroup.builder()
78+
.options(Arrays.asList(initProperties(Action.Option.builder().build())))
79+
.build(), true)))
80+
.options(Arrays.asList(initProperties(Action.Option.builder().build(), true)))
81+
.selectedOptions(Arrays.asList(initProperties(Action.Option.builder().build(), true)))
82+
.build(),
83+
true
84+
)))
6385
.mrkdwnIn(Arrays.asList(""))
6486
.build())
6587
);
@@ -75,14 +97,22 @@ private Json() {
7597

7698
public static List<BlockElement> BlockElements = asElements(
7799
initProperties(button(b -> b.confirm(Confirm))),
100+
initProperties(checkboxes(b -> b.initialOptions(Arrays.asList(Option)).confirm(Confirm))),
101+
initProperties(radioButtons(b -> b.initialOption(Option).confirm(Confirm))),
78102
initProperties(channelsSelect(c -> c.confirm(Confirm))),
103+
initProperties(multiChannelsSelect(c -> c.initialChannels(Arrays.asList("")).confirm(Confirm))),
79104
initProperties(conversationsSelect(c -> c.confirm(Confirm))),
105+
initProperties(multiConversationsSelect(c -> c.initialConversations(Arrays.asList("")).confirm(Confirm))),
80106
initProperties(datePicker(d -> d.confirm(Confirm))),
107+
initProperties(timePicker(d -> d.confirm(Confirm))),
81108
initProperties(externalSelect(e -> e.initialOption(Option).confirm(Confirm))),
109+
initProperties(multiExternalSelect(e -> e.initialOptions(Arrays.asList(Option)).confirm(Confirm))),
82110
initProperties(com.slack.api.model.block.element.BlockElements.image(i -> i)),
83111
initProperties(overflowMenu(o -> o.confirm(Confirm))),
84112
initProperties(staticSelect(s -> s.initialOption(Option).confirm(Confirm))),
85-
initProperties(usersSelect(u -> u.confirm(Confirm)))
113+
initProperties(multiStaticSelect(s -> s.initialOptions(Arrays.asList(Option)).confirm(Confirm))),
114+
initProperties(usersSelect(u -> u.confirm(Confirm))),
115+
initProperties(multiUsersSelect(u -> u.initialUsers(Arrays.asList("")).confirm(Confirm)))
86116
);
87117
public static List<ContextBlockElement> ContextBlockElements = asContextElements(
88118
initProperties(ImageElement.builder().build())
@@ -91,7 +121,62 @@ private Json() {
91121
initProperties(plainText(pt -> pt)),
92122
initProperties(markdownText(m -> m))
93123
);
94-
public static List<LayoutBlock> Blocks = asBlocks(
124+
125+
public static List<SectionBlock> SectionBlocksWithAccessory = new ArrayList<>();
126+
127+
static {
128+
for (BlockElement element : BlockElements) {
129+
SectionBlocksWithAccessory.add(initProperties(
130+
SectionBlock.builder()
131+
.accessory(element)
132+
.text(TextObject).fields(SectionBlockFieldElements).build()));
133+
}
134+
}
135+
136+
public static List<LayoutBlock> Blocks = new ArrayList<>();
137+
138+
static {
139+
Blocks.addAll(asBlocks(
140+
initProperties(actions(a -> a.elements(BlockElements))),
141+
initProperties(context(c -> c.elements(ContextBlockElements))),
142+
initProperties(divider()),
143+
initProperties(com.slack.api.model.block.Blocks.image(i -> i)),
144+
initProperties(section(s -> s
145+
.accessory(initProperties(ImageElement.builder().build()))
146+
.text(TextObject)
147+
.fields(SectionBlockFieldElements)))
148+
));
149+
Blocks.addAll(SectionBlocksWithAccessory);
150+
}
151+
152+
public static PlainTextInputElement plainTextInputElement = initProperties(PlainTextInputElement.builder()
153+
.placeholder(initProperties(PlainTextObject.builder().build()))
154+
.dispatchActionConfig(initProperties(DispatchActionConfig.builder().triggerActionsOn(Arrays.asList("")).build()))
155+
.build());
156+
public static RadioButtonsElement radioButtonsElement = initProperties(RadioButtonsElement.builder()
157+
.confirm(initProperties(ConfirmationDialogObject.builder()
158+
.text(initProperties(PlainTextObject.builder().build()))
159+
.build()))
160+
.options(Arrays.asList(
161+
initProperties(OptionObject.builder().text(initProperties(PlainTextObject.builder().build())).build()),
162+
initProperties(OptionObject.builder().text(initProperties(MarkdownTextObject.builder().build())).build())
163+
))
164+
.initialOption(initProperties(OptionObject.builder().text(initProperties(PlainTextObject.builder().build())).build()))
165+
.build());
166+
167+
public static List<LayoutBlock> ModalBlocks = asBlocks(
168+
initProperties(input(i -> i.element(plainTextInputElement))),
169+
initProperties(input(i -> i.element(radioButtonsElement))),
170+
initProperties(input(i -> i.element(initProperties(button(b -> b.confirm(Confirm)))))),
171+
initProperties(input(i -> i.element(initProperties(channelsSelect(c -> c.confirm(Confirm)))))),
172+
initProperties(input(i -> i.element(initProperties(conversationsSelect(c -> c.confirm(Confirm)))))),
173+
initProperties(input(i -> i.element(initProperties(datePicker(d -> d.confirm(Confirm)))))),
174+
initProperties(input(i -> i.element(initProperties(timePicker(d -> d.confirm(Confirm)))))),
175+
initProperties(input(i -> i.element(initProperties(externalSelect(e -> e.initialOption(Option).confirm(Confirm)))))),
176+
initProperties(input(ip -> ip.element(initProperties(com.slack.api.model.block.element.BlockElements.image(i -> i))))),
177+
initProperties(input(i -> i.element(initProperties(overflowMenu(o -> o.confirm(Confirm)))))),
178+
initProperties(input(i -> i.element(initProperties(staticSelect(s -> s.initialOption(Option).confirm(Confirm)))))),
179+
initProperties(input(i -> i.element(initProperties(usersSelect(u -> u.confirm(Confirm)))))),
95180
initProperties(actions(a -> a.elements(BlockElements))),
96181
initProperties(context(c -> c.elements(ContextBlockElements))),
97182
initProperties(divider()),
@@ -102,11 +187,9 @@ private Json() {
102187
.fields(SectionBlockFieldElements)))
103188
);
104189

105-
public static Message Message = new Message();
190+
public static File FileObject = initFileObject();
106191

107-
static {
108-
Message.setAttachments(Attachments);
109-
Message.setBlocks(Blocks);
192+
public static File initFileObject() {
110193
File.Shares shares = new File.Shares();
111194
Map<String, List<File.ShareDetail>> channels = new HashMap<>();
112195
File.ShareDetail shareDetail = initProperties(new File.ShareDetail());
@@ -115,9 +198,33 @@ private Json() {
115198
channels.put("C03E94MKU_", Arrays.asList(shareDetail));
116199
shares.setPrivateChannels(channels);
117200
shares.setPublicChannels(channels);
118-
File file = initProperties(File.builder().shares(shares).build());
119-
Message.setFile(file);
120-
Message.setFiles(Arrays.asList(file));
201+
List<String> stringList = Arrays.asList("");
202+
List<File.Address> addressList = Arrays.asList(initProperties(new File.Address()));
203+
List<Reaction> reactionList = Arrays.asList(initProperties(Reaction.builder().users(stringList).build()));
204+
File file = initProperties(File.builder()
205+
.headers(initProperties(new com.slack.api.model.File.Headers()))
206+
.shares(shares)
207+
.channels(stringList)
208+
.groups(stringList)
209+
.ims(stringList)
210+
.to(addressList)
211+
.from(addressList)
212+
.cc(addressList)
213+
.pinnedTo(stringList)
214+
.reactions(reactionList)
215+
.attachments(Attachments)
216+
.blocks(Blocks)
217+
.build());
218+
return file;
219+
}
220+
221+
public static Message Message = new Message();
222+
223+
static {
224+
Message.setAttachments(Attachments);
225+
Message.setBlocks(Blocks);
226+
Message.setFile(FileObject);
227+
Message.setFiles(Arrays.asList(FileObject));
121228
Message.setPinnedTo(Arrays.asList(""));
122229
Message.setReactions(Arrays.asList(initProperties(new Reaction())));
123230
Message.setReplyUsers(Arrays.asList(""));

json-logs/samples/api/auth.test.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
"team_id": "T00000000",
77
"user_id": "U00000000",
88
"bot_id": "B00000000",
9-
"enterprise_id": "E00000000",
10-
"error": "",
9+
"is_enterprise_install": false,
1110
"app_name": "",
1211
"app_id": "A00000000",
13-
"is_enterprise_install": false,
12+
"enterprise_id": "E00000000",
13+
"error": "",
1414
"needed": "",
1515
"provided": ""
1616
}

0 commit comments

Comments
 (0)