From a7c05c7a8c111d4e56610eb09edbc23360940b6f Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Tue, 14 Jul 2026 15:15:34 -0700 Subject: [PATCH] feat(methods): add blocks.validate method Add the blocks.validate Web API method to the Slack API client. Callers can validate Block Kit payloads via methods().blocksValidate(req) (and the async equivalent), passing blocks, message, or view as JSON-encoded strings. No scopes are required. Adds the endpoint constant, sync and async interface methods and impls, the request form builder, the request/response model classes (with an errors[] list of code/message/pointer/relatedComponent), the Tier3 rate limit, a local test, and a response sample for type generation. Co-Authored-By: Claude --- json-logs/samples/api/blocks.validate.json | 20 +++++++++ metadata/web-api/rate_limit_tiers.json | 1 + .../slack/api/methods/AsyncMethodsClient.java | 10 +++++ .../java/com/slack/api/methods/Methods.java | 6 +++ .../com/slack/api/methods/MethodsClient.java | 12 ++++++ .../slack/api/methods/MethodsRateLimits.java | 2 + .../slack/api/methods/RequestFormBuilder.java | 9 ++++ .../methods/impl/AsyncMethodsClientImpl.java | 12 ++++++ .../api/methods/impl/MethodsClientImpl.java | 12 ++++++ .../request/blocks/BlocksValidateRequest.java | 27 ++++++++++++ .../blocks/BlocksValidateResponse.java | 30 +++++++++++++ .../java/test_locally/api/MethodsTest.java | 2 +- .../test_locally/api/methods/BlocksTest.java | 42 +++++++++++++++++++ 13 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 json-logs/samples/api/blocks.validate.json create mode 100644 slack-api-client/src/main/java/com/slack/api/methods/request/blocks/BlocksValidateRequest.java create mode 100644 slack-api-client/src/main/java/com/slack/api/methods/response/blocks/BlocksValidateResponse.java create mode 100644 slack-api-client/src/test/java/test_locally/api/methods/BlocksTest.java diff --git a/json-logs/samples/api/blocks.validate.json b/json-logs/samples/api/blocks.validate.json new file mode 100644 index 000000000..b99a88772 --- /dev/null +++ b/json-logs/samples/api/blocks.validate.json @@ -0,0 +1,20 @@ +{ + "ok": false, + "error": "", + "response_metadata": { + "messages": [ + "" + ] + }, + "needed": "", + "provided": "", + "errors": [ + { + "code": "", + "message": "", + "pointer": "", + "related_component": "" + } + ], + "warning": "" +} diff --git a/metadata/web-api/rate_limit_tiers.json b/metadata/web-api/rate_limit_tiers.json index 93f929e67..472b4e56a 100644 --- a/metadata/web-api/rate_limit_tiers.json +++ b/metadata/web-api/rate_limit_tiers.json @@ -124,6 +124,7 @@ "bookmarks.edit": "Tier2", "bookmarks.list": "Tier3", "bookmarks.remove": "Tier2", + "blocks.validate": "Tier3", "bots.info": "Tier3", "calls.add": "Tier2", "calls.end": "Tier2", diff --git a/slack-api-client/src/main/java/com/slack/api/methods/AsyncMethodsClient.java b/slack-api-client/src/main/java/com/slack/api/methods/AsyncMethodsClient.java index 4d9b57ead..5427aa341 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/AsyncMethodsClient.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/AsyncMethodsClient.java @@ -54,6 +54,7 @@ import com.slack.api.methods.request.bookmarks.BookmarksEditRequest; import com.slack.api.methods.request.bookmarks.BookmarksListRequest; import com.slack.api.methods.request.bookmarks.BookmarksRemoveRequest; +import com.slack.api.methods.request.blocks.BlocksValidateRequest; import com.slack.api.methods.request.bots.BotsInfoRequest; import com.slack.api.methods.request.calls.CallsAddRequest; import com.slack.api.methods.request.calls.CallsEndRequest; @@ -193,6 +194,7 @@ import com.slack.api.methods.response.bookmarks.BookmarksEditResponse; import com.slack.api.methods.response.bookmarks.BookmarksListResponse; import com.slack.api.methods.response.bookmarks.BookmarksRemoveResponse; +import com.slack.api.methods.response.blocks.BlocksValidateResponse; import com.slack.api.methods.response.bots.BotsInfoResponse; import com.slack.api.methods.response.calls.CallsAddResponse; import com.slack.api.methods.response.calls.CallsEndResponse; @@ -915,6 +917,14 @@ CompletableFuture CompletableFuture bookmarksRemove(RequestConfigurator req); + // ------------------------------ + // blocks + // ------------------------------ + + CompletableFuture blocksValidate(BlocksValidateRequest req); + + CompletableFuture blocksValidate(RequestConfigurator req); + // ------------------------------ // bots // ------------------------------ diff --git a/slack-api-client/src/main/java/com/slack/api/methods/Methods.java b/slack-api-client/src/main/java/com/slack/api/methods/Methods.java index 2e39655d4..3c28410f3 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/Methods.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/Methods.java @@ -304,6 +304,12 @@ private Methods() { public static final String AUTH_TEAMS_LIST = "auth.teams.list"; + // ------------------------------ + // blocks + // ------------------------------ + + public static final String BLOCKS_VALIDATE = "blocks.validate"; + // ------------------------------ // bookmarks // ------------------------------ diff --git a/slack-api-client/src/main/java/com/slack/api/methods/MethodsClient.java b/slack-api-client/src/main/java/com/slack/api/methods/MethodsClient.java index 3a4722eb0..73c68f6ba 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/MethodsClient.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/MethodsClient.java @@ -60,6 +60,7 @@ import com.slack.api.methods.request.bookmarks.BookmarksEditRequest; import com.slack.api.methods.request.bookmarks.BookmarksListRequest; import com.slack.api.methods.request.bookmarks.BookmarksRemoveRequest; +import com.slack.api.methods.request.blocks.BlocksValidateRequest; import com.slack.api.methods.request.bots.BotsInfoRequest; import com.slack.api.methods.request.calls.CallsAddRequest; import com.slack.api.methods.request.calls.CallsEndRequest; @@ -212,6 +213,7 @@ import com.slack.api.methods.response.bookmarks.BookmarksEditResponse; import com.slack.api.methods.response.bookmarks.BookmarksListResponse; import com.slack.api.methods.response.bookmarks.BookmarksRemoveResponse; +import com.slack.api.methods.response.blocks.BlocksValidateResponse; import com.slack.api.methods.response.bots.BotsInfoResponse; import com.slack.api.methods.response.calls.CallsAddResponse; import com.slack.api.methods.response.calls.CallsEndResponse; @@ -1355,6 +1357,16 @@ AuthTestResponse authTest(RequestConfigurator req) throws IOException, SlackApiException; + // ------------------------------ + // blocks + // ------------------------------ + + BlocksValidateResponse blocksValidate(BlocksValidateRequest req) throws IOException, SlackApiException; + + BlocksValidateResponse blocksValidate( + RequestConfigurator req) + throws IOException, SlackApiException; + // ------------------------------ // bookmarks // ------------------------------ diff --git a/slack-api-client/src/main/java/com/slack/api/methods/MethodsRateLimits.java b/slack-api-client/src/main/java/com/slack/api/methods/MethodsRateLimits.java index 9ecc6fee6..d26e4abe7 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/MethodsRateLimits.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/MethodsRateLimits.java @@ -242,6 +242,8 @@ public static void setRateLimitTier(String methodName, MethodsRateLimitTier tier setRateLimitTier(BOOKMARKS_LIST, Tier3); setRateLimitTier(BOOKMARKS_REMOVE, Tier2); + setRateLimitTier(BLOCKS_VALIDATE, Tier3); + setRateLimitTier(BOTS_INFO, Tier3); setRateLimitTier(CALLS_ADD, Tier2); diff --git a/slack-api-client/src/main/java/com/slack/api/methods/RequestFormBuilder.java b/slack-api-client/src/main/java/com/slack/api/methods/RequestFormBuilder.java index cb5884a7e..75677e9eb 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/RequestFormBuilder.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/RequestFormBuilder.java @@ -61,6 +61,7 @@ import com.slack.api.methods.request.bookmarks.BookmarksEditRequest; import com.slack.api.methods.request.bookmarks.BookmarksListRequest; import com.slack.api.methods.request.bookmarks.BookmarksRemoveRequest; +import com.slack.api.methods.request.blocks.BlocksValidateRequest; import com.slack.api.methods.request.bots.BotsInfoRequest; import com.slack.api.methods.request.calls.CallsAddRequest; import com.slack.api.methods.request.calls.CallsEndRequest; @@ -1251,6 +1252,14 @@ public static FormBody.Builder toForm(BookmarksRemoveRequest req) { return form; } + public static FormBody.Builder toForm(BlocksValidateRequest req) { + FormBody.Builder form = new FormBody.Builder(); + setIfNotNull("blocks", req.getBlocks(), form); + setIfNotNull("message", req.getMessage(), form); + setIfNotNull("view", req.getView(), form); + return form; + } + public static FormBody.Builder toForm(BotsInfoRequest req) { FormBody.Builder form = new FormBody.Builder(); setIfNotNull("bot", req.getBot(), form); diff --git a/slack-api-client/src/main/java/com/slack/api/methods/impl/AsyncMethodsClientImpl.java b/slack-api-client/src/main/java/com/slack/api/methods/impl/AsyncMethodsClientImpl.java index 21e007510..5b1e3bbf1 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/impl/AsyncMethodsClientImpl.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/impl/AsyncMethodsClientImpl.java @@ -59,6 +59,7 @@ import com.slack.api.methods.request.bookmarks.BookmarksEditRequest; import com.slack.api.methods.request.bookmarks.BookmarksListRequest; import com.slack.api.methods.request.bookmarks.BookmarksRemoveRequest; +import com.slack.api.methods.request.blocks.BlocksValidateRequest; import com.slack.api.methods.request.bots.BotsInfoRequest; import com.slack.api.methods.request.calls.CallsAddRequest; import com.slack.api.methods.request.calls.CallsEndRequest; @@ -198,6 +199,7 @@ import com.slack.api.methods.response.bookmarks.BookmarksEditResponse; import com.slack.api.methods.response.bookmarks.BookmarksListResponse; import com.slack.api.methods.response.bookmarks.BookmarksRemoveResponse; +import com.slack.api.methods.response.blocks.BlocksValidateResponse; import com.slack.api.methods.response.bots.BotsInfoResponse; import com.slack.api.methods.response.calls.CallsAddResponse; import com.slack.api.methods.response.calls.CallsEndResponse; @@ -1520,6 +1522,16 @@ public CompletableFuture bookmarksRemove(RequestConfigu return bookmarksRemove(req.configure(BookmarksRemoveRequest.builder()).build()); } + @Override + public CompletableFuture blocksValidate(BlocksValidateRequest req) { + return executor.execute(BLOCKS_VALIDATE, toMap(req), () -> methods.blocksValidate(req)); + } + + @Override + public CompletableFuture blocksValidate(RequestConfigurator req) { + return blocksValidate(req.configure(BlocksValidateRequest.builder()).build()); + } + @Override public CompletableFuture botsInfo(BotsInfoRequest req) { return executor.execute(BOTS_INFO, toMap(req), () -> methods.botsInfo(req)); diff --git a/slack-api-client/src/main/java/com/slack/api/methods/impl/MethodsClientImpl.java b/slack-api-client/src/main/java/com/slack/api/methods/impl/MethodsClientImpl.java index f1d26b619..9d4303b1c 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/impl/MethodsClientImpl.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/impl/MethodsClientImpl.java @@ -62,6 +62,7 @@ import com.slack.api.methods.request.bookmarks.BookmarksEditRequest; import com.slack.api.methods.request.bookmarks.BookmarksListRequest; import com.slack.api.methods.request.bookmarks.BookmarksRemoveRequest; +import com.slack.api.methods.request.blocks.BlocksValidateRequest; import com.slack.api.methods.request.bots.BotsInfoRequest; import com.slack.api.methods.request.calls.CallsAddRequest; import com.slack.api.methods.request.calls.CallsEndRequest; @@ -214,6 +215,7 @@ import com.slack.api.methods.response.bookmarks.BookmarksEditResponse; import com.slack.api.methods.response.bookmarks.BookmarksListResponse; import com.slack.api.methods.response.bookmarks.BookmarksRemoveResponse; +import com.slack.api.methods.response.blocks.BlocksValidateResponse; import com.slack.api.methods.response.bots.BotsInfoResponse; import com.slack.api.methods.response.calls.CallsAddResponse; import com.slack.api.methods.response.calls.CallsEndResponse; @@ -1598,6 +1600,16 @@ public BookmarksRemoveResponse bookmarksRemove(RequestConfigurator req) throws IOException, SlackApiException { + return blocksValidate(req.configure(BlocksValidateRequest.builder()).build()); + } + @Override public BotsInfoResponse botsInfo(BotsInfoRequest req) throws IOException, SlackApiException { this.teamId.ifPresent(currentTeamId -> { diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/blocks/BlocksValidateRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/blocks/BlocksValidateRequest.java new file mode 100644 index 000000000..62476a338 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/blocks/BlocksValidateRequest.java @@ -0,0 +1,27 @@ +package com.slack.api.methods.request.blocks; + +import com.slack.api.methods.SlackApiRequest; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class BlocksValidateRequest implements SlackApiRequest { + + private String token; + + /** + * A JSON-encoded string of an array of blocks to validate. + */ + private String blocks; + + /** + * A JSON-encoded string of a message payload to validate. + */ + private String message; + + /** + * A JSON-encoded string of a view payload to validate. + */ + private String view; +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/response/blocks/BlocksValidateResponse.java b/slack-api-client/src/main/java/com/slack/api/methods/response/blocks/BlocksValidateResponse.java new file mode 100644 index 000000000..493f3b548 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/response/blocks/BlocksValidateResponse.java @@ -0,0 +1,30 @@ +package com.slack.api.methods.response.blocks; + +import com.slack.api.methods.SlackApiTextResponse; +import com.slack.api.model.ResponseMetadata; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class BlocksValidateResponse implements SlackApiTextResponse { + + private boolean ok; + private String warning; + private String error; + private String needed; + private String provided; + private transient Map> httpResponseHeaders; + + private ResponseMetadata responseMetadata; + private List errors; + + @Data + public static class Error { + private String code; + private String message; + private String pointer; + private String relatedComponent; + } +} diff --git a/slack-api-client/src/test/java/test_locally/api/MethodsTest.java b/slack-api-client/src/test/java/test_locally/api/MethodsTest.java index 39f74b8bb..15d1c3643 100644 --- a/slack-api-client/src/test/java/test_locally/api/MethodsTest.java +++ b/slack-api-client/src/test/java/test_locally/api/MethodsTest.java @@ -20,7 +20,7 @@ public void verifyTheCoverage() { // https://docs.slack.dev/reference/methods // var methodNames = [].slice.call(document.getElementsByClassName('apiReferenceFilterableList__listItemLink')).map(e => e.href.replace("https://docs.slack.dev/reference/methods/", ""));console.log(methodNames.toString());console.log(methodNames.length); // 308 endpoints as of February 26, 2026 - String methods = "admin.analytics.getFile,admin.apps.activities.list,admin.apps.approve,admin.apps.clearResolution,admin.apps.restrict,admin.apps.uninstall,admin.apps.approved.list,admin.apps.config.lookup,admin.apps.config.set,admin.apps.requests.cancel,admin.apps.requests.list,admin.apps.restricted.list,admin.audit.anomaly.allow.getItem,admin.audit.anomaly.allow.updateItem,admin.auth.policy.assignEntities,admin.auth.policy.getEntities,admin.auth.policy.removeEntities,admin.barriers.create,admin.barriers.delete,admin.barriers.list,admin.barriers.update,admin.conversations.archive,admin.conversations.bulkArchive,admin.conversations.bulkDelete,admin.conversations.bulkMove,admin.conversations.convertToPrivate,admin.conversations.convertToPublic,admin.conversations.create,admin.conversations.createForObjects,admin.conversations.delete,admin.conversations.disconnectShared,admin.conversations.getConversationPrefs,admin.conversations.getCustomRetention,admin.conversations.getTeams,admin.conversations.invite,admin.conversations.linkObjects,admin.conversations.lookup,admin.conversations.removeCustomRetention,admin.conversations.rename,admin.conversations.search,admin.conversations.setConversationPrefs,admin.conversations.setCustomRetention,admin.conversations.setTeams,admin.conversations.unarchive,admin.conversations.unlinkObjects,admin.conversations.ekm.listOriginalConnectedChannelInfo,admin.conversations.restrictAccess.addGroup,admin.conversations.restrictAccess.listGroups,admin.conversations.restrictAccess.removeGroup,admin.emoji.add,admin.emoji.addAlias,admin.emoji.list,admin.emoji.remove,admin.emoji.rename,admin.functions.list,admin.functions.permissions.lookup,admin.functions.permissions.set,admin.inviteRequests.approve,admin.inviteRequests.deny,admin.inviteRequests.list,admin.inviteRequests.approved.list,admin.inviteRequests.denied.list,admin.roles.addAssignments,admin.roles.listAssignments,admin.roles.removeAssignments,admin.teams.admins.list,admin.teams.create,admin.teams.list,admin.teams.owners.list,admin.teams.settings.info,admin.teams.settings.setDefaultChannels,admin.teams.settings.setDescription,admin.teams.settings.setDiscoverability,admin.teams.settings.setIcon,admin.teams.settings.setName,admin.usergroups.addChannels,admin.usergroups.addTeams,admin.usergroups.listChannels,admin.usergroups.removeChannels,admin.users.assign,admin.users.getExpiration,admin.users.invite,admin.users.list,admin.users.remove,admin.users.setAdmin,admin.users.setExpiration,admin.users.setOwner,admin.users.setRegular,admin.users.session.clearSettings,admin.users.session.getSettings,admin.users.session.invalidate,admin.users.session.list,admin.users.session.reset,admin.users.session.resetBulk,admin.users.session.setSettings,admin.users.unsupportedVersions.export,admin.workflows.collaborators.add,admin.workflows.collaborators.remove,admin.workflows.permissions.lookup,admin.workflows.search,admin.workflows.unpublish,admin.workflows.triggers.types.permissions.lookup,admin.workflows.triggers.types.permissions.set,api.test,apps.activities.list,apps.auth.external.delete,apps.auth.external.get,apps.connections.open,apps.datastore.bulkDelete,apps.datastore.bulkGet,apps.datastore.bulkPut,apps.datastore.count,apps.datastore.delete,apps.datastore.get,apps.datastore.put,apps.datastore.query,apps.datastore.update,apps.event.authorizations.list,apps.manifest.create,apps.manifest.delete,apps.manifest.export,apps.manifest.update,apps.manifest.validate,apps.uninstall,apps.user.connection.update,assistant.search.context,assistant.threads.setStatus,assistant.threads.setSuggestedPrompts,assistant.threads.setTitle,auth.revoke,auth.test,auth.teams.list,bookmarks.add,bookmarks.edit,bookmarks.list,bookmarks.remove,bots.info,calls.add,calls.end,calls.info,calls.update,calls.participants.add,calls.participants.remove,canvases.access.delete,canvases.access.set,canvases.create,canvases.delete,canvases.edit,canvases.sections.lookup,channels.mark,chat.appendStream,chat.delete,chat.deleteScheduledMessage,chat.getPermalink,chat.meMessage,chat.postEphemeral,chat.postMessage,chat.scheduleMessage,chat.startStream,chat.stopStream,chat.unfurl,chat.update,chat.scheduledMessages.list,conversations.acceptSharedInvite,conversations.approveSharedInvite,conversations.archive,conversations.close,conversations.create,conversations.declineSharedInvite,conversations.history,conversations.info,conversations.invite,conversations.inviteShared,conversations.join,conversations.kick,conversations.leave,conversations.list,conversations.listConnectInvites,conversations.mark,conversations.members,conversations.open,conversations.rename,conversations.replies,conversations.setPurpose,conversations.setTopic,conversations.unarchive,conversations.canvases.create,conversations.externalInvitePermissions.set,conversations.requestSharedInvite.approve,conversations.requestSharedInvite.deny,conversations.requestSharedInvite.list,dialog.open,dnd.endDnd,dnd.endSnooze,dnd.info,dnd.setSnooze,dnd.teamInfo,emoji.list,files.comments.delete,files.completeUploadExternal,files.delete,files.getUploadURLExternal,files.info,files.list,files.revokePublicURL,files.sharedPublicURL,files.upload,files.remote.add,files.remote.info,files.remote.list,files.remote.remove,files.remote.share,files.remote.update,functions.completeError,functions.completeSuccess,functions.distributions.permissions.add,functions.distributions.permissions.list,functions.distributions.permissions.remove,functions.distributions.permissions.set,functions.workflows.steps.list,functions.workflows.steps.responses.export,groups.mark,migration.exchange,oauth.access,oauth.v2.access,oauth.v2.exchange,openid.connect.token,openid.connect.userInfo,pins.add,pins.list,pins.remove,reactions.add,reactions.get,reactions.list,reactions.remove,reminders.add,reminders.complete,reminders.delete,reminders.info,reminders.list,rtm.connect,rtm.start,search.all,search.files,search.messages,slackLists.access.delete,slackLists.access.set,slackLists.create,slackLists.download.get,slackLists.download.start,slackLists.items.create,slackLists.items.delete,slackLists.items.deleteMultiple,slackLists.items.info,slackLists.items.list,slackLists.items.update,slackLists.update,stars.add,stars.list,stars.remove,team.accessLogs,team.billableInfo,team.info,team.integrationLogs,team.billing.info,team.externalTeams.disconnect,team.externalTeams.list,team.preferences.list,team.profile.get,tooling.tokens.rotate,usergroups.create,usergroups.disable,usergroups.enable,usergroups.list,usergroups.update,usergroups.users.list,usergroups.users.update,users.conversations,users.deletePhoto,users.getPresence,users.identity,users.info,users.list,users.lookupByEmail,users.setActive,users.setPhoto,users.setPresence,users.discoverableContacts.lookup,users.profile.get,users.profile.set,views.open,views.publish,views.push,views.update,workflows.featured.add,workflows.featured.list,workflows.featured.remove,workflows.featured.set,workflows.stepCompleted,workflows.stepFailed,workflows.updateStep,workflows.triggers.permissions.add,workflows.triggers.permissions.list,workflows.triggers.permissions.remove,workflows.triggers.permissions.set,im.list,im.mark,mpim.list,mpim.mark"; + String methods = "admin.analytics.getFile,admin.apps.activities.list,admin.apps.approve,admin.apps.clearResolution,admin.apps.restrict,admin.apps.uninstall,admin.apps.approved.list,admin.apps.config.lookup,admin.apps.config.set,admin.apps.requests.cancel,admin.apps.requests.list,admin.apps.restricted.list,admin.audit.anomaly.allow.getItem,admin.audit.anomaly.allow.updateItem,admin.auth.policy.assignEntities,admin.auth.policy.getEntities,admin.auth.policy.removeEntities,admin.barriers.create,admin.barriers.delete,admin.barriers.list,admin.barriers.update,admin.conversations.archive,admin.conversations.bulkArchive,admin.conversations.bulkDelete,admin.conversations.bulkMove,admin.conversations.convertToPrivate,admin.conversations.convertToPublic,admin.conversations.create,admin.conversations.createForObjects,admin.conversations.delete,admin.conversations.disconnectShared,admin.conversations.getConversationPrefs,admin.conversations.getCustomRetention,admin.conversations.getTeams,admin.conversations.invite,admin.conversations.linkObjects,admin.conversations.lookup,admin.conversations.removeCustomRetention,admin.conversations.rename,admin.conversations.search,admin.conversations.setConversationPrefs,admin.conversations.setCustomRetention,admin.conversations.setTeams,admin.conversations.unarchive,admin.conversations.unlinkObjects,admin.conversations.ekm.listOriginalConnectedChannelInfo,admin.conversations.restrictAccess.addGroup,admin.conversations.restrictAccess.listGroups,admin.conversations.restrictAccess.removeGroup,admin.emoji.add,admin.emoji.addAlias,admin.emoji.list,admin.emoji.remove,admin.emoji.rename,admin.functions.list,admin.functions.permissions.lookup,admin.functions.permissions.set,admin.inviteRequests.approve,admin.inviteRequests.deny,admin.inviteRequests.list,admin.inviteRequests.approved.list,admin.inviteRequests.denied.list,admin.roles.addAssignments,admin.roles.listAssignments,admin.roles.removeAssignments,admin.teams.admins.list,admin.teams.create,admin.teams.list,admin.teams.owners.list,admin.teams.settings.info,admin.teams.settings.setDefaultChannels,admin.teams.settings.setDescription,admin.teams.settings.setDiscoverability,admin.teams.settings.setIcon,admin.teams.settings.setName,admin.usergroups.addChannels,admin.usergroups.addTeams,admin.usergroups.listChannels,admin.usergroups.removeChannels,admin.users.assign,admin.users.getExpiration,admin.users.invite,admin.users.list,admin.users.remove,admin.users.setAdmin,admin.users.setExpiration,admin.users.setOwner,admin.users.setRegular,admin.users.session.clearSettings,admin.users.session.getSettings,admin.users.session.invalidate,admin.users.session.list,admin.users.session.reset,admin.users.session.resetBulk,admin.users.session.setSettings,admin.users.unsupportedVersions.export,admin.workflows.collaborators.add,admin.workflows.collaborators.remove,admin.workflows.permissions.lookup,admin.workflows.search,admin.workflows.unpublish,admin.workflows.triggers.types.permissions.lookup,admin.workflows.triggers.types.permissions.set,api.test,apps.activities.list,apps.auth.external.delete,apps.auth.external.get,apps.connections.open,apps.datastore.bulkDelete,apps.datastore.bulkGet,apps.datastore.bulkPut,apps.datastore.count,apps.datastore.delete,apps.datastore.get,apps.datastore.put,apps.datastore.query,apps.datastore.update,apps.event.authorizations.list,apps.manifest.create,apps.manifest.delete,apps.manifest.export,apps.manifest.update,apps.manifest.validate,apps.uninstall,apps.user.connection.update,assistant.search.context,assistant.threads.setStatus,assistant.threads.setSuggestedPrompts,assistant.threads.setTitle,auth.revoke,auth.test,auth.teams.list,bookmarks.add,bookmarks.edit,bookmarks.list,bookmarks.remove,blocks.validate,bots.info,calls.add,calls.end,calls.info,calls.update,calls.participants.add,calls.participants.remove,canvases.access.delete,canvases.access.set,canvases.create,canvases.delete,canvases.edit,canvases.sections.lookup,channels.mark,chat.appendStream,chat.delete,chat.deleteScheduledMessage,chat.getPermalink,chat.meMessage,chat.postEphemeral,chat.postMessage,chat.scheduleMessage,chat.startStream,chat.stopStream,chat.unfurl,chat.update,chat.scheduledMessages.list,conversations.acceptSharedInvite,conversations.approveSharedInvite,conversations.archive,conversations.close,conversations.create,conversations.declineSharedInvite,conversations.history,conversations.info,conversations.invite,conversations.inviteShared,conversations.join,conversations.kick,conversations.leave,conversations.list,conversations.listConnectInvites,conversations.mark,conversations.members,conversations.open,conversations.rename,conversations.replies,conversations.setPurpose,conversations.setTopic,conversations.unarchive,conversations.canvases.create,conversations.externalInvitePermissions.set,conversations.requestSharedInvite.approve,conversations.requestSharedInvite.deny,conversations.requestSharedInvite.list,dialog.open,dnd.endDnd,dnd.endSnooze,dnd.info,dnd.setSnooze,dnd.teamInfo,emoji.list,files.comments.delete,files.completeUploadExternal,files.delete,files.getUploadURLExternal,files.info,files.list,files.revokePublicURL,files.sharedPublicURL,files.upload,files.remote.add,files.remote.info,files.remote.list,files.remote.remove,files.remote.share,files.remote.update,functions.completeError,functions.completeSuccess,functions.distributions.permissions.add,functions.distributions.permissions.list,functions.distributions.permissions.remove,functions.distributions.permissions.set,functions.workflows.steps.list,functions.workflows.steps.responses.export,groups.mark,migration.exchange,oauth.access,oauth.v2.access,oauth.v2.exchange,openid.connect.token,openid.connect.userInfo,pins.add,pins.list,pins.remove,reactions.add,reactions.get,reactions.list,reactions.remove,reminders.add,reminders.complete,reminders.delete,reminders.info,reminders.list,rtm.connect,rtm.start,search.all,search.files,search.messages,slackLists.access.delete,slackLists.access.set,slackLists.create,slackLists.download.get,slackLists.download.start,slackLists.items.create,slackLists.items.delete,slackLists.items.deleteMultiple,slackLists.items.info,slackLists.items.list,slackLists.items.update,slackLists.update,stars.add,stars.list,stars.remove,team.accessLogs,team.billableInfo,team.info,team.integrationLogs,team.billing.info,team.externalTeams.disconnect,team.externalTeams.list,team.preferences.list,team.profile.get,tooling.tokens.rotate,usergroups.create,usergroups.disable,usergroups.enable,usergroups.list,usergroups.update,usergroups.users.list,usergroups.users.update,users.conversations,users.deletePhoto,users.getPresence,users.identity,users.info,users.list,users.lookupByEmail,users.setActive,users.setPhoto,users.setPresence,users.discoverableContacts.lookup,users.profile.get,users.profile.set,views.open,views.publish,views.push,views.update,workflows.featured.add,workflows.featured.list,workflows.featured.remove,workflows.featured.set,workflows.stepCompleted,workflows.stepFailed,workflows.updateStep,workflows.triggers.permissions.add,workflows.triggers.permissions.list,workflows.triggers.permissions.remove,workflows.triggers.permissions.set,im.list,im.mark,mpim.list,mpim.mark"; final List existingMethods = new ArrayList<>(); for (Field f : Methods.class.getDeclaredFields()) { int modifiers = f.getModifiers(); diff --git a/slack-api-client/src/test/java/test_locally/api/methods/BlocksTest.java b/slack-api-client/src/test/java/test_locally/api/methods/BlocksTest.java new file mode 100644 index 000000000..7225e2de6 --- /dev/null +++ b/slack-api-client/src/test/java/test_locally/api/methods/BlocksTest.java @@ -0,0 +1,42 @@ +package test_locally.api.methods; + +import com.slack.api.Slack; +import com.slack.api.SlackConfig; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import util.MockSlackApiServer; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static test_locally.api.status.ApiTest.ValidToken; + +public class BlocksTest { + + MockSlackApiServer server = new MockSlackApiServer(); + SlackConfig config = new SlackConfig(); + Slack slack = Slack.getInstance(config); + + @Before + public void setup() throws Exception { + server.start(); + config.setMethodsEndpointUrlPrefix(server.getMethodsEndpointPrefix()); + } + + @After + public void tearDown() throws Exception { + server.stop(); + } + + @Test + public void validate() throws Exception { + assertThat(slack.methods(ValidToken).blocksValidate(r -> r + .blocks("[{\"type\":\"section\",\"text\":{\"type\":\"plain_text\",\"text\":\"Hello world\"}}]")).isOk(), is(true)); + } + + @Test + public void validate_async() throws Exception { + assertThat(slack.methodsAsync(ValidToken).blocksValidate(r -> r + .blocks("[{\"type\":\"section\",\"text\":{\"type\":\"plain_text\",\"text\":\"Hello world\"}}]")).get().isOk(), is(true)); + } +}