Fixing DataSources Parsing Errors

Description
Fix for breaking change in Security Analytics plugin
Issues Resolved
[List any issues this PR will resolve]
Check List

[x] New functionality includes testing.

[x] All tests pass

[N/A] New functionality has been documented.

[N/A] New functionality has javadoc added

[x] Commits are signed per the DCO using --signoff

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
For more information on following Developer Certificate of Origin and signing off your commits, please check here.

CIs blocked because job runners are unavailable, output of local build:
toepkerd@bcd0740f818a common-utils % ./gradlew build

> Task :compileTestKotlin
w: file:///Users/toepkerd/Documents/SecurityAnalytics/common-utils/src/test/kotlin/org/opensearch/commons/alerting/TestHelpers.kt:197:9 Condition 'input == null' is always 'false'
w: file:///Users/toepkerd/Documents/SecurityAnalytics/common-utils/src/test/kotlin/org/opensearch/commons/alerting/TestHelpers.kt:629:9 Name shadowed: id
w: file:///Users/toepkerd/Documents/SecurityAnalytics/common-utils/src/test/kotlin/org/opensearch/commons/alerting/TestHelpers.kt:634:9 Name shadowed: state
w: file:///Users/toepkerd/Documents/SecurityAnalytics/common-utils/src/test/kotlin/org/opensearch/commons/alerting/action/DocLevelMonitorFanOutResponseTests.kt:45:49 Unchecked cast: Map<String, Map<String, String>> to MutableMap<String, Any>
w: file:///Users/toepkerd/Documents/SecurityAnalytics/common-utils/src/test/kotlin/org/opensearch/commons/alerting/action/GetFindingsResponseTests.kt:59:13 Variable 'newReq' is never used
w: file:///Users/toepkerd/Documents/SecurityAnalytics/common-utils/src/test/kotlin/org/opensearch/commons/alerting/action/IndexWorkflowRequestTests.kt:241:9 The value 'listOf(
            Delegate(1, "monitor-1")
        )' assigned to 'var delegates: List<Delegate> defined in org.opensearch.commons.alerting.action.IndexWorkflowRequestTests.`test validate`' is never used

> Task :test

ConfigConstantsTest > testSecureHttpKeystorePassword() PASSED

ConfigConstantsTest > testLegacyHttpKeystorePassword() PASSED

InjectSecurityTest > testInjectRoles() PASSED

InjectSecurityTest > testUsersRolesEmpty() PASSED

InjectSecurityTest > testInjectProperty() PASSED

InjectSecurityTest > testInjectUser() PASSED

InjectSecurityTest > testInjectUserInfo() PASSED

UserTest > testStreamConstForNoTenantUser() PASSED

UserTest > testParseUserStringEmpty() PASSED

UserTest > testParseUserStringNoRoles() PASSED

UserTest > testEmptyConst() PASSED

UserTest > testUserIsAdminDnFalse() PASSED

UserTest > testNullTenantJsonConst() PASSED

UserTest > testParseUserStringNameWithTenant() PASSED

UserTest > testStreamConstForTenantUser() PASSED

UserTest > testParseUserStringNoRolesWithTenant() PASSED

UserTest > testParamsConstForTenantUser() PASSED

UserTest > testParseUserString() PASSED

UserTest > testParamsConstForNoTenantUser() PASSED

UserTest > testParseUserStringNobackendRoles() PASSED

UserTest > testParseUserStringMalformed() PASSED

UserTest > testUserOrSettingsAreNullOrEmpty() PASSED

UserTest > testParseUserStringName() PASSED

UserTest > testUserIsAdminDnTrue() PASSED

UserTest > testNonNullTenantJsonConst() PASSED

LegacyChimeMessageTest > testContentMissingMessage() PASSED

LegacyChimeMessageTest > testRoundTrippingLegacyChimeMessage() PASSED

LegacyChimeMessageTest > testBuildingLegacyChimeMessage() PASSED

LegacyChimeMessageTest > testUrlMissingMessage() PASSED

LegacyChimeMessageTest > testMissingDestinationName() PASSED

LegacyCustomWebhookMessageTest > testURLandHostNameMissingOrEmpty() PASSED

LegacyCustomWebhookMessageTest > testBuildingLegacyCustomWebhookMessage() PASSED

LegacyCustomWebhookMessageTest > testContentMissingMessage() PASSED

LegacyCustomWebhookMessageTest > testRoundTrippingLegacyCustomWebhookMessageWithUrl() PASSED

LegacyCustomWebhookMessageTest > testMissingDestinationName() PASSED

LegacyCustomWebhookMessageTest > testRoundTrippingLegacyCustomWebhookMessageWithHostFails() PASSED

LegacyCustomWebhookMessageTest > testUnsupportedHttpMethods() PASSED

LegacyEmailMessageTest > testRoundTrippingLegacyEmailMessage() PASSED

LegacyEmailMessageTest > testBuildingLegacyEmailMessage() PASSED

LegacyEmailMessageTest > testContentMissingMessage() PASSED

LegacyEmailMessageTest > testUnsupportedMethods() PASSED

LegacyEmailMessageTest > testAccountNameMissingOrEmpty() PASSED

LegacyEmailMessageTest > testFromMissingOrEmpty() PASSED

LegacyEmailMessageTest > testSubjectDefaultsToDestinationNameWhenMissingOrEmpty() PASSED

LegacyEmailMessageTest > testRecipientsMissingOrEmpty() PASSED

LegacyEmailMessageTest > testMissingDestinationName() PASSED

LegacyEmailMessageTest > testHostMissingOrEmpty() PASSED

LegacySlackMessageTest > testRoundTrippingLegacySlackMessage() PASSED

LegacySlackMessageTest > testBuildingLegacySlackMessage() PASSED

LegacySlackMessageTest > testContentMissingMessage() PASSED

LegacySlackMessageTest > testUrlMissingMessage() PASSED

LegacySlackMessageTest > testMissingDestinationName() PASSED

LegacySlackMessageTest > testUrlEmptyMessage() PASSED

LegacyDestinationResponseTest > testRoundTrippingLegacyDestinationResponse() PASSED

LegacyDestinationResponseTest > testMissingLegacyDestinationStatusCode() PASSED

LegacyDestinationResponseTest > testMissingLegacyDestinationResponse() PASSED

LegacyDestinationResponseTest > testBuildingLegacyDestinationResponse() PASSED

IntegrationTests > testCreateRestClientWithUser() SKIPPED

IntegrationTests > testCreateRestClientWithCerts() SKIPPED

IntegrationTests > testCreateRestClientWithoutPem() SKIPPED

SecureRestClientBuilderTest > testMissingPem() STANDARD_ERROR
    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

SecureRestClientBuilderTest > testMissingPem() PASSED

SecureRestClientBuilderTest > testMissingConfigPath() PASSED

SecureRestClientBuilderTest > testHttpsRestClient() PASSED

SecureRestClientBuilderTest > testHttpRestClient() PASSED

TrustStoreTest > testCreate() PASSED

AlertTests > test alert in audit state() PASSED

AlertTests > test agg alert as template args() PASSED

AlertTests > test chained alert() PASSED

AlertTests > test alert as template args() PASSED

AlertTests > test alert acknowledged() PASSED

OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appende

> Task :test

AlertingPluginInterfaceTests > getMonitor() PASSED

AlertingPluginInterfaceTests > deleteWorkflow() PASSED

AlertingPluginInterfaceTests > acknowledgeAlerts() PASSED

AlertingPluginInterfaceTests > indexBucketMonitor() PASSED

AlertingPluginInterfaceTests > acknowledgeChainedAlerts() PASSED

AlertingPluginInterfaceTests > getWorkflowAlerts() PASSED

AlertingPluginInterfaceTests > publishFindings() PASSED

AlertingPluginInterfaceTests > getAlerts() PASSED

AlertingPluginInterfaceTests > indexWorkflow() PASSED

AlertingPluginInterfaceTests > deleteMonitor() PASSED

AlertingPluginInterfaceTests > getFindings() PASSED

AlertingPluginInterfaceTests > indexMonitor() PASSED

AlertingPluginInterfaceTests > searchMonitors() PASSED

AlertingPluginInterfaceTests > getWorkflow() PASSED

CorrelationAlertTests > test correlation alert as template args() PASSED

CorrelationAlertTests > Feature Correlation Alert serialize and deserialize should be equal() PASSED

CorrelationAlertTests > test alert acknowledged() PASSED

MonitorTests > test enabled time() PASSED

MonitorTests > test max triggers() PASSED

AcknowledgeAlertRequestTests > test acknowledge alert request() PASSED

AcknowledgeAlertResponseTests > test acknowledge alert response() PASSED

AcknowledgeChainedAlertRequestTests > test acknowledge chained alert request() PASSED

DeleteCommentRequestTests > test delete comment request writing and parsing() PASSED

DeleteCommentResponseTests > test delete comment response writing and parsing() PASSED

DeleteMonitorRequestTests > test delete monitor request() PASSED

DeleteWorkflowRequestTests > test delete workflow request() PASSED

DeleteWorkflowResponseTests > test delete workflow response() PASSED

DocLevelMonitorFanOutRequestTests > test doc level monitor fan out request as stream() PASSED

DocLevelMonitorFanOutResponseTests > test doc level monitor fan out response with errors as stream() PASSED

DocLevelMonitorFanOutResponseTests > test doc level monitor fan out response as stream() PASSED

GetAlertsRequestTests > test validate returns null() PASSED

GetAlertsRequestTests > test get alerts request with filter() PASSED

GetAlertsRequestTests > test get alerts request() PASSED

GetAlertsResponseTests > test get alerts response with alerts() PASSED

GetAlertsResponseTests > test get alerts response with no alerts() PASSED

GetAlertsResponseTests > test toXContent for get alerts response() PASSED

GetFindingsRequestTests > test validate returns null() PASSED

GetFindingsRequestTests > test get findings request() PASSED

GetFindingsResponseTests > test get findings response() PASSED

GetWorkflowAlertsRequestTests > test validate returns null() PASSED

GetWorkflowAlertsRequestTests > test get alerts request with custom alerts and associated alerts indices() PASSED

GetWorkflowAlertsRequestTests > test get alerts request() PASSED

GetWorkflowAlertsResponseTests > test get alerts response with alerts() PASSED

GetWorkflowAlertsResponseTests > test get alerts response with no alerts() PASSED

GetWorkflowAlertsResponseTests > test toXContent for get alerts response() PASSED

GetWorkflowRequestTests > testGetWorkflowRequest() PASSED

GetWorkflowResponseTests > testGetWorkflowResponse() PASSED

GetWorkflowResponseTests > testGetWorkflowResponseWhereAuditDelegateMonitorAlertsFlagIsNotSet() PASSED

IndexCommentRequestTests > test index comment post request() PASSED

IndexCommentRequestTests > test index comment put request() PASSED

IndexCommentResponseTests > test index comment response with comment() PASSED

IndexMonitorRequestTests > test index bucket monitor post request() PASSED

IndexMonitorRequestTests > test index monitor put request() PASSED

IndexMonitorRequestTests > test index monitor post request() PASSED

IndexMonitorRequestTests > Index bucket monitor serialize and deserialize transport object should be equal() PASSED

IndexMonitorResponseTests > test index monitor response with monitor() PASSED

IndexWorkflowRequestTests > Index composite workflow serialize and deserialize transport object should be equal() PASSED

IndexWorkflowRequestTests > test validate() PASSED

IndexWorkflowRequestTests > test index composite workflow post request() PASSED

IndexWorkflowRequestTests > test index workflow post request() PASSED

IndexWorkflowRequestTests > test index workflow put request() PASSED

IndexWorkflowResponseTests > test index workflow response with workflow() PASSED

PublishFindingsRequestTests > test delete monitor request() PASSED

AlertErrorTests > test alertError obfuscates IP addresses in message() PASSED

BucketLevelTriggerTests > test asTemplateArgs returns expected values() PASSED

ClusterMetricsInputTests > test ClusterMetricsInput cannot determine ApiType when invalid path is provided as URI component() PASSED

ClusterMetricsInputTests > test parsePathParams with path params in url() PASSED

ClusterMetricsInputTests > test ClusterMetricsInput correctly determines ApiType when path is provided as URI component() PASSED

ClusterMetricsInputTests > test url field contains invalid characters() PASSED

ClusterMetricsInputTests > test ClusterMetricsInput creation when all inputs are empty() PASSED

ClusterMetricsInputTests > test parseEmptyFields populates empty path and path_params when url is provided() PASSED

ClusterMetricsInputTests > test parsePathParams with path params containing illegal characters() PASSED

ClusterMetricsInputTests > test valid ClusterMetricsInput creation using HTTP URI component fields() PASSED

ClusterMetricsInputTests > test valid ClusterMetricsInput creation using HTTP url field() PASSED

ClusterMetricsInputTests > test invalid scheme in url field() PASSED

ClusterMetricsInputTests > test multiple invalid clusters() PASSED

ClusterMetricsInputTests > test ClusterMetricsInput cannot determine ApiType when invaid path is provided in URL() PASSED

ClusterMetricsInputTests > test valid ClusterMetricsInput creation using HTTPS url field() PASSED

ClusterMetricsInputTests > test ClusterMetricsInput correctly determines ApiType when path is provided in URL field() PASSED

ClusterMetricsInputTests > test invalid url() PASSED

ClusterMetricsInputTests > test multiple valid clusters() PASSED

ClusterMetricsInputTests > test ClusterMetricsInput creation when all inputs but path params are empty() PASSED

ClusterMetricsInputTests > test ClusterMetricsInput correctly determines ApiType when path and path params are provided in URL field() PASSED

ClusterMetricsInputTests > test ClusterMetricsInput cannot determine ApiType when invalid path and path params are provided as URI components() PASSED

ClusterMetricsInputTests > test invalid path() PASSED

ClusterMetricsInputTests > test parsePathParams with no path params for ApiType that requires path params() PASSED

ClusterMetricsInputTests > test invalid host in url field() PASSED

ClusterMetricsInputTests > test a single valid cluster() PASSED

ClusterMetricsInputTests > test ClusterMetricsInput correctly determines ApiType when path and path params are provided as URI components() PASSED

ClusterMetricsInputTests > test parsePathParams with no path params() PASSED

ClusterMetricsInputTests > test url field and URI component fields with path params create equal URI() PASSED

ClusterMetricsInputTests > test a single invalid cluster() PASSED

ClusterMetricsInputTests > test ClusterMetricsInput cannot determine ApiType when invaid path and path params are provided in URL() PASSED

ClusterMetricsInputTests > test parsePathParams with path params for ApiType that doesn't support path params() PASSED

ClusterMetricsInputTests > test parsePathParams with path params as URI field() PASSED

ClusterMetricsInputTests > test invalid port in url field() PASSED

ClusterMetricsInputTests > test url field and URI component fields create different URI() PASSED

ClusterMetricsInputTests > test url field and URI component fields with path params create different URI() PASSED

ClusterMetricsInputTests > test URI fields provided and url contains invalid characters() PASSED

ClusterMetricsInputTests > test parseEmptyFields populates empty url field when path and path_params are provided() PASSED

ClusterMetricsInputTests > test url field and URI component fields create equal URI() PASSED

CompositeInputTests > test create Delegate with illegal monitorId value() PASSED

CompositeInputTests > test create Chained Findings with null monitorId value and  monitorIds list with blank monitorIds() PASSED

CompositeInputTests > test delegate asTemplateArgs() PASSED

CompositeInputTests > test create Chained Findings with illegal monitorId value and empty monitorIds list() PASSED

CompositeInputTests > test sequence asTemplateArgs() PASSED

CompositeInputTests > test create Delegate with illegal order value() PASSED

DataSourcesTests > Test DataSources construction with no comments indices() PASSED

DocLevelMonitorInputTests > test DocLevelQuery asTemplateArgs() PASSED

DocLevelMonitorInputTests > test create Doc Level Query with invalid characters for tags() PASSED

DocLevelMonitorInputTests > test DocLevelMonitorInput asTemplateArgs() PASSED

DocLevelMonitorInputTests > test create Doc Level Query with invalid name length() PASSED

FindingTests > test finding asTemplateArgs() PASSED

ScheduleTest > test two types() PASSED

ScheduleTest > test time zone conversion() PASSED

ScheduleTest > test invalid interval units() PASSED

ScheduleTest > test interval period ending at() PASSED

ScheduleTest > period job 3 minutes() PASSED

ScheduleTest > test cron calculates next time to execute after restart() PASSED

ScheduleTest > period job running on time() PASSED

ScheduleTest > test cron schedule round trip() PASSED

ScheduleTest > test interval calculates next time to execute using enabled time() PASSED

ScheduleTest > test interval calculates next time to execute using cached previous time() PASSED

ScheduleTest > test cron calculates next time to execute using cached previous time() PASSED

ScheduleTest > period job not running on time() PASSED

ScheduleTest > test interval period starting at() PASSED

ScheduleTest > test time zone() PASSED

ScheduleTest > period job test null last execution time() PASSED

ScheduleTest > cron job running on time() PASSED

ScheduleTest > period job running exactly at interval() PASSED

ScheduleTest > test cron invalid timezone rule() PASSED

ScheduleTest > test invalid cron expression() PASSED

ScheduleTest > test cron period starting at() PASSED

ScheduleTest > test cron invalid timezone offset() PASSED

ScheduleTest > test invalid type() PASSED

ScheduleTest > cron job not running on time() PASSED

ScheduleTest > test interval schedule round trip() PASSED

ScheduleTest > test cron invalid missing timezone() PASSED

ScheduleTest > test cron period ending at() PASSED

WriteableTests > test action execution policy as stream() PASSED

WriteableTests > test query-level monitorrunresult as stream() PASSED

WriteableTests > test chained alert trigger as stream() PASSED

WriteableTests > test inputrunresult as stream() PASSED

WriteableTests > test RemoteMonitorTrigger as stream() PASSED

WriteableTests > test doc-level query with query Field Names as stream() PASSED

WriteableTests > test doc-level triggerrunresult as stream() PASSED

WriteableTests > test bucket-level triggerrunresult as stream() PASSED

WriteableTests > test user as stream() PASSED

WriteableTests > test searchinput as stream() PASSED

WriteableTests > test RemoteDocLevelMonitorInput as stream() PASSED

WriteableTests > test RemoteMonitorInput as stream() PASSED

WriteableTests > test empty user as stream() PASSED

WriteableTests > test action as stream with throttled enabled and null throttle() PASSED

WriteableTests > test doc-level query as stream() PASSED

WriteableTests > test doc-level monitorrunresult as stream() PASSED

WriteableTests > test action as stream with null throttle() PASSED

WriteableTests > test bucket-level monitorrunresult as stream() PASSED

WriteableTests > test action as stream() PASSED

WriteableTests > test actionrunresult as stream() PASSED

WriteableTests > test query-level trigger as stream() PASSED

WriteableTests > test workflow as stream() PASSED

WriteableTests > test query-level triggerrunresult as stream() PASSED

WriteableTests > test action as stream with null subject template() PASSED

WriteableTests > test DocumentLevelTriggerRunResult as stream() PASSED

WriteableTests > test query-level monitor as stream() PASSED

WriteableTests > test doc-level trigger as stream() PASSED

WriteableTests > test bucket-level trigger as stream() PASSED

WriteableTests > test throttle as stream() PASSED

XContentTests > test DataSources parsing() PASSED

XContentTests > test creating a monitor with duplicate trigger ids fails() PASSED

XContentTests > test throttle parsing() PASSED

XContentTests > test monitor parsing with no schedule() PASSED

XContentTests > test user parsing() PASSED

XContentTests > test no-op trigger parsing() PASSED

XContentTests > test action parsing with null subject template() PASSED

XContentTests > test RemoteMonitorInput() PASSED

XContentTests > test monitor parsing with no name() PASSED

XContentTests > test chainedMonitorFindings parsing() PASSED

XContentTests > test action execution result parsing() PASSED

XContentTests > test composite workflow parsing() PASSED

XContentTests > test composite workflow parsing with auditDelegateMonitorAlerts flag disabled() PASSED

XContentTests > test query-level trigger parsing() PASSED

XContentTests > test query-level monitor parsing without user() PASSED

XContentTests > test RemoteMonitorTrigger() PASSED

XContentTests > test throttle parsing with negative value() PASSED

XContentTests > test RemoteDocLevelMonitorInput() PASSED

XContentTests > test bucket-level monitor parsing() PASSED

XContentTests > test old monitor format parsing() PASSED

XContentTests > test creating an bucket-level monitor with invalid trigger type fails() PASSED

XContentTests > test action parsing with null throttle() PASSED

XContentTests > test MonitorMetadata() PASSED

XContentTests > test action with per execution scope does not support throttling() PASSED

XContentTests > test doc level query toXcontent() PASSED

XContentTests > test throttle parsing with wrong unit() PASSED

XContentTests > test doc level query toXcontent with query field names() PASSED

XContentTests > test creating an bucket-level monitor with invalid input fails() PASSED

XContentTests > test alert parsing with noop trigger() PASSED

XContentTests > test action parsing() PASSED

XContentTests > test workflow parsing() PASSED

XContentTests > test bucket-level trigger parsing() PASSED

XContentTests > test alert parsing() PASSED

XContentTests > test alert parsing with user as null() PASSED

XContentTests > test creating an query-level monitor with invalid trigger type fails() PASSED

XContentTests > test alert parsing without user() PASSED

XContentTests > test action execution policy() PASSED

XContentTests > test empty user parsing() PASSED

NotificationsPluginInterfaceTests > getNotificationConfig() PASSED

NotificationsPluginInterfaceTests > getPluginFeatures() PASSED

NotificationsPluginInterfaceTests > getChannelList() PASSED

NotificationsPluginInterfaceTests > updateNotificationConfig() PASSED

NotificationsPluginInterfaceTests > publishLegacyNotification() PASSED

NotificationsPluginInterfaceTests > sendNotification() PASSED

NotificationsPluginInterfaceTests > createNotificationConfig() PASSED

NotificationsPluginInterfaceTests > deleteNotificationConfig() PASSED

CreateNotificationConfigRequestTests > Create config serialize and deserialize using json object should be equal EmailGroup() PASSED

CreateNotificationConfigRequestTests > Create config serialize and deserialize transport object should be equal microsoft teams() PASSED

CreateNotificationConfigRequestTests > Create config serialize and deserialize transport object should be equal emailGroup() PASSED

CreateNotificationConfigRequestTests > Create config should deserialize json object using parser Email Group() PASSED

CreateNotificationConfigRequestTests > Create config serialize and deserialize transport object should be equal chime() PASSED

CreateNotificationConfigRequestTests > Create config serialize and deserialize transport object should be equal email() PASSED

CreateNotificationConfigRequestTests > Create config serialize and deserialize transport object should be equal slack() PASSED

CreateNotificationConfigRequestTests > Create config should deserialize json object using parser Chime() PASSED

CreateNotificationConfigRequestTests > Create config should deserialize json object using parser slack() PASSED

CreateNotificationConfigRequestTests > Create config serialize and deserialize using json object should be equal() PASSED

CreateNotificationConfigRequestTests > Create config serialize and deserialize using json object should be equal SmtpAccount() PASSED

CreateNotificationConfigRequestTests > Create config should deserialize json object using parser webhook() PASSED

CreateNotificationConfigRequestTests > Create config should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,087][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: extra_field_1, while parsing configuration
    [2024-06-11T13:41:25,089][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: extra_field_2, while parsing configuration
    [2024-06-11T13:41:25,089][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: extra_field_3, while parsing configuration

CreateNotificationConfigRequestTests > Create config should safely ignore extra field in json object() PASSED

CreateNotificationConfigRequestTests > Update config should deserialize json object using parser Email() PASSED

CreateNotificationConfigRequestTests > Create config serialize and deserialize using json object should be equal microsoft teams() PASSED

CreateNotificationConfigRequestTests > Create config should deserialize json object using parser microsoft teams() PASSED

CreateNotificationConfigRequestTests > Create config should throw exception when invalid json object is passed() PASSED

CreateNotificationConfigRequestTests > Update config should deserialize json object using parser SmtpAccount() PASSED

CreateNotificationConfigRequestTests > Create config serialize and deserialize transport object should be equal SmtpAccount() PASSED

CreateNotificationConfigRequestTests > Create config with special char in config_id should fail() PASSED

CreateNotificationConfigRequestTests > Create config serialize and deserialize transport object should be equal webhook() PASSED

CreateNotificationConfigRequestTests > Create config serialize and deserialize using json object should be equal chime() PASSED

CreateNotificationConfigRequestTests > Create config serialize and deserialize using json object should be equal email() PASSED

CreateNotificationConfigRequestTests > Create config serialize and deserialize using json object should be equal slack() PASSED

CreateNotificationConfigResponseTests > Create response should throw exception when configId is replace with configId2 in json object() STANDARD_OUT
    [2024-06-11T13:41:25,117][INFO ][o.o.c.n.a.CreateNotificationConfigResponse] [[Test worker]] Unexpected field: config_id2, while parsing CreateNotificationConfigResponse

CreateNotificationConfigResponseTests > Create response should throw exception when configId is replace with configId2 in json object() PASSED

CreateNotificationConfigResponseTests > Create response should deserialize json object using parser() PASSED

CreateNotificationConfigResponseTests > Create response should throw exception when invalid json object is passed() PASSED

CreateNotificationConfigResponseTests > Create response should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,120][INFO ][o.o.c.n.a.CreateNotificationConfigResponse] [[Test worker]] Unexpected field: extra_field_1, while parsing CreateNotificationConfigResponse
    [2024-06-11T13:41:25,121][INFO ][o.o.c.n.a.CreateNotificationConfigResponse] [[Test worker]] Unexpected field: extra_field_2, while parsing CreateNotificationConfigResponse
    [2024-06-11T13:41:25,121][INFO ][o.o.c.n.a.CreateNotificationConfigResponse] [[Test worker]] Unexpected field: extra_field_3, while parsing CreateNotificationConfigResponse

CreateNotificationConfigResponseTests > Create response should safely ignore extra field in json object() PASSED

CreateNotificationConfigResponseTests > Create response serialize and deserialize transport object should be equal() PASSED

CreateNotificationConfigResponseTests > Create response serialize and deserialize using json object should be equal() PASSED

DeleteNotificationConfigRequestTests > Delete request serialize and deserialize using json object should be equal() PASSED

DeleteNotificationConfigRequestTests > Delete request should throw exception when config_id_lists is replace with config_id_lists2 in json object() STANDARD_OUT
    [2024-06-11T13:41:25,124][INFO ][o.o.c.n.a.DeleteNotificationConfigRequest] [[Test worker]] Unexpected field: config_id_lists, while parsing DeleteNotificationConfigRequest

DeleteNotificationConfigRequestTests > Delete request should throw exception when config_id_lists is replace with config_id_lists2 in json object() PASSED

DeleteNotificationConfigRequestTests > Delete request should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,125][INFO ][o.o.c.n.a.DeleteNotificationConfigRequest] [[Test worker]] Unexpected field: extra_field_1, while parsing DeleteNotificationConfigRequest
    [2024-06-11T13:41:25,126][INFO ][o.o.c.n.a.DeleteNotificationConfigRequest] [[Test worker]] Unexpected field: extra_field_2, while parsing DeleteNotificationConfigRequest
    [2024-06-11T13:41:25,126][INFO ][o.o.c.n.a.DeleteNotificationConfigRequest] [[Test worker]] Unexpected field: extra_field_3, while parsing DeleteNotificationConfigRequest

DeleteNotificationConfigRequestTests > Delete request should safely ignore extra field in json object() PASSED

DeleteNotificationConfigRequestTests > Delete request should throw exception when invalid json object is passed() PASSED

DeleteNotificationConfigRequestTests > Delete request should deserialize json object using parser() PASSED

DeleteNotificationConfigRequestTests > Delete request serialize and deserialize transport object should be equal() PASSED

DeleteNotificationConfigResponseTests > Delete response should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,130][INFO ][o.o.c.n.a.DeleteNotificationConfigResponse] [[Test worker]] Unexpected field: extra_field_1, while parsing DeleteNotificationConfigResponse
    [2024-06-11T13:41:25,130][INFO ][o.o.c.n.a.DeleteNotificationConfigResponse] [[Test worker]] Unexpected field: extra_field_2, while parsing DeleteNotificationConfigResponse
    [2024-06-11T13:41:25,130][INFO ][o.o.c.n.a.DeleteNotificationConfigResponse] [[Test worker]] Unexpected field: extra_field_3, while parsing DeleteNotificationConfigResponse

DeleteNotificationConfigResponseTests > Delete response should safely ignore extra field in json object() PASSED

DeleteNotificationConfigResponseTests > Delete response should deserialize json object using parser() PASSED

DeleteNotificationConfigResponseTests > Delete response serialize and deserialize using json object should be equal() PASSED

DeleteNotificationConfigResponseTests > Delete response should throw exception when configId is replace with configId2 in json object() STANDARD_OUT
    [2024-06-11T13:41:25,131][INFO ][o.o.c.n.a.DeleteNotificationConfigResponse] [[Test worker]] Unexpected field: config_id2, while parsing DeleteNotificationConfigResponse

DeleteNotificationConfigResponseTests > Delete response should throw exception when configId is replace with configId2 in json object() PASSED

DeleteNotificationConfigResponseTests > Delete response should throw exception when invalid json object is passed() PASSED

DeleteNotificationConfigResponseTests > Delete response serialize and deserialize transport object should be equal() PASSED

GetChannelListRequestTests > Get request should throw exception when invalid json object is passed() PASSED

GetChannelListRequestTests > Get request should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,137][INFO ][o.o.c.n.a.GetChannelListRequest] [[Test worker]] Unexpected field: extra_field_1, while parsing GetChannelListRequest
    [2024-06-11T13:41:25,137][INFO ][o.o.c.n.a.GetChannelListRequest] [[Test worker]] Unexpected field: extra_field_2, while parsing GetChannelListRequest
    [2024-06-11T13:41:25,137][INFO ][o.o.c.n.a.GetChannelListRequest] [[Test worker]] Unexpected field: extra_field_3, while parsing GetChannelListRequest

GetChannelListRequestTests > Get request should safely ignore extra field in json object() PASSED

GetChannelListRequestTests > Get request serialize and deserialize using json object should be equal() PASSED

GetChannelListRequestTests > Get request serialize and deserialize transport object should be equal() PASSED

GetChannelListResponseTests > Get Response should throw exception if channelList is absent in json() PASSED

GetChannelListResponseTests > Get Response should use isEnabled=true if absent in json object() PASSED

GetChannelListResponseTests > Get Response serialize and deserialize using json with multiple config object should be equal() PASSED

GetChannelListResponseTests > Get Response serialize and deserialize using json config object should be equal() PASSED

GetChannelListResponseTests > Get Response should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,142][INFO ][o.o.c.n.m.SearchResults  ] [[Test worker]] Skipping Unknown field extra_field_1
    [2024-06-11T13:41:25,143][INFO ][o.o.c.n.m.SearchResults  ] [[Test worker]] Skipping Unknown field extra_field_2
    [2024-06-11T13:41:25,143][INFO ][o.o.c.n.m.SearchResults  ] [[Test worker]] Skipping Unknown field extra_field_3

GetChannelListResponseTests > Get Response should safely ignore extra field in json object() PASSED

GetChannelListResponseTests > Get Response serialize and deserialize with multiple config object should be equal() PASSED

GetChannelListResponseTests > Get Response should safely fallback to default if startIndex, totalHits or totalHitRelation field absent in json object() PASSED

GetChannelListResponseTests > Get Response serialize and deserialize with config object should be equal() PASSED

GetNotificationConfigRequestTests > Get request with only config_id field should deserialize json object using parser() PASSED

GetNotificationConfigRequestTests > Get request with only sort_order=asc field should deserialize json object using parser() PASSED

GetNotificationConfigRequestTests > Get request no field should deserialize json object using parser() PASSED

GetNotificationConfigRequestTests > Get request with only sort_order=ASC field should deserialize json object using parser() PASSED

GetNotificationConfigRequestTests > Get request should throw exception when invalid json object is passed() PASSED

GetNotificationConfigRequestTests > Get request with only sort_order=DESC field should deserialize json object using parser() PASSED

GetNotificationConfigRequestTests > Get request with only from_index field should deserialize json object using parser() PASSED

GetNotificationConfigRequestTests > Get request with invalid sort_order should throw exception() PASSED

GetNotificationConfigRequestTests > Get request with only sort_order=desc field should deserialize json object using parser() PASSED

GetNotificationConfigRequestTests > Get request with only filter_param_list field should deserialize json object using parser() PASSED

GetNotificationConfigRequestTests > Get request should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,152][INFO ][o.o.c.n.a.GetNotificationConfigRequest] [[Test worker]] Unexpected field: extra_field_1, while parsing GetNotificationConfigRequest
    [2024-06-11T13:41:25,152][INFO ][o.o.c.n.a.GetNotificationConfigRequest] [[Test worker]] Unexpected field: extra_field_2, while parsing GetNotificationConfigRequest
    [2024-06-11T13:41:25,152][INFO ][o.o.c.n.a.GetNotificationConfigRequest] [[Test worker]] Unexpected field: extra_field_3, while parsing GetNotificationConfigRequest

GetNotificationConfigRequestTests > Get request should safely ignore extra field in json object() PASSED

GetNotificationConfigRequestTests > Get request with only max_items field should deserialize json object using parser() PASSED

GetNotificationConfigRequestTests > Get request serialize and deserialize using json object should be equal() PASSED

GetNotificationConfigRequestTests > Get request with only sort_field field should deserialize json object using parser() PASSED

GetNotificationConfigRequestTests > Get request with all field should deserialize json object using parser() PASSED

GetNotificationConfigRequestTests > Get request serialize and deserialize transport object should be equal() PASSED

GetNotificationConfigResponseTests > Search result should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,157][INFO ][o.o.c.n.m.SearchResults  ] [[Test worker]] Skipping Unknown field extra_field_1
    [2024-06-11T13:41:25,158][INFO ][o.o.c.n.m.SearchResults  ] [[Test worker]] Skipping Unknown field extra_field_2
    [2024-06-11T13:41:25,158][INFO ][o.o.c.n.m.SearchResults  ] [[Test worker]] Skipping Unknown field extra_field_3

GetNotificationConfigResponseTests > Search result should safely ignore extra field in json object() PASSED

GetNotificationConfigResponseTests > Search result serialize and deserialize with multiple config object should be equal() PASSED

GetNotificationConfigResponseTests > Search result should throw exception if notificationConfigs is absent in json() PASSED

GetNotificationConfigResponseTests > Search result serialize and deserialize with config object should be equal() PASSED

GetNotificationConfigResponseTests > Search result serialize and deserialize using json config object should be equal() PASSED

GetNotificationConfigResponseTests > Search result should safely fallback to default if startIndex, totalHits or totalHitRelation field absent in json object() PASSED

GetNotificationConfigResponseTests > Search result serialize and deserialize using json with multiple config object should be equal() PASSED

GetPluginFeaturesRequestTests > Get request should throw exception when invalid json object is passed() PASSED

GetPluginFeaturesRequestTests > Get request should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,166][INFO ][o.o.c.n.a.GetPluginFeaturesRequest] [[Test worker]] Unexpected field: extra_field_1, while parsing GetPluginFeaturesRequest
    [2024-06-11T13:41:25,166][INFO ][o.o.c.n.a.GetPluginFeaturesRequest] [[Test worker]] Unexpected field: extra_field_2, while parsing GetPluginFeaturesRequest
    [2024-06-11T13:41:25,166][INFO ][o.o.c.n.a.GetPluginFeaturesRequest] [[Test worker]] Unexpected field: extra_field_3, while parsing GetPluginFeaturesRequest

GetPluginFeaturesRequestTests > Get request should safely ignore extra field in json object() PASSED

GetPluginFeaturesRequestTests > Get request serialize and deserialize using json object should be equal() PASSED

GetPluginFeaturesRequestTests > Get request serialize and deserialize transport object should be equal() PASSED

GetPluginFeaturesResponseTests > Get Response should throw exception if allowed_config_type_list is absent in json() PASSED

GetPluginFeaturesResponseTests > Get Response serialize and deserialize using json config object should be equal() PASSED

GetPluginFeaturesResponseTests > Get Response should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,169][INFO ][o.o.c.n.a.GetPluginFeaturesResponse] [[Test worker]] Unexpected field: extra_field_1, while parsing DeleteNotificationConfigResponse
    [2024-06-11T13:41:25,170][INFO ][o.o.c.n.a.GetPluginFeaturesResponse] [[Test worker]] Unexpected field: extra_field_2, while parsing DeleteNotificationConfigResponse
    [2024-06-11T13:41:25,170][INFO ][o.o.c.n.a.GetPluginFeaturesResponse] [[Test worker]] Unexpected field: extra_field_3, while parsing DeleteNotificationConfigResponse

GetPluginFeaturesResponseTests > Get Response should safely ignore extra field in json object() PASSED

GetPluginFeaturesResponseTests > Get Response should throw exception if plugin_features is absent in json() STANDARD_OUT
    [2024-06-11T13:41:25,170][INFO ][o.o.c.n.a.GetPluginFeaturesResponse] [[Test worker]] Unexpected field: config_type_list, while parsing DeleteNotificationConfigResponse

GetPluginFeaturesResponseTests > Get Response should throw exception if plugin_features is absent in json() PASSED

GetPluginFeaturesResponseTests > Get Response serialize and deserialize transport object should be equal() PASSED

LegacyPublishNotificationRequestTests > publish request serialize and deserialize transport object should be equal() PASSED

LegacyPublishNotificationResponseTests > Create response serialize and deserialize transport object should be equal() PASSED

SendNotificationRequestTests > Send request validate return exception if channelIds field is empty() PASSED

SendNotificationRequestTests > Send request should safely ignore thread context is absent in json object() PASSED

SendNotificationRequestTests > Send request should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,179][INFO ][o.o.c.n.a.SendNotificationRequest] [[Test worker]] Unexpected field: extra_field_1, while parsing SendNotificationRequest
    [2024-06-11T13:41:25,179][INFO ][o.o.c.n.a.SendNotificationRequest] [[Test worker]] Unexpected field: extra_field_2, while parsing SendNotificationRequest
    [2024-06-11T13:41:25,180][INFO ][o.o.c.n.a.SendNotificationRequest] [[Test worker]] Unexpected field: extra_field_3, while parsing SendNotificationRequest

SendNotificationRequestTests > Send request should safely ignore extra field in json object() PASSED

SendNotificationRequestTests > Send request should throw exception if channelMessage field is absent in json object() PASSED

SendNotificationRequestTests > Send request serialize and deserialize using json object should be equal() PASSED

SendNotificationRequestTests > Send request should throw exception if channelIds field is absent in json object() PASSED

SendNotificationRequestTests > Send request should throw exception if notificationInfo field is absent in json object() PASSED

SendNotificationRequestTests > Send request serialize and deserialize transport object should be equal() PASSED

SendNotificationRequestTests > Send request should throw exception when invalid json object is passed() PASSED

UpdateNotificationConfigRequestTests > Update config serialize and deserialize using json object should be equal SmtpAccount() PASSED

UpdateNotificationConfigRequestTests > Update config serialize and deserialize transport object should be equal EmailGroup() PASSED

UpdateNotificationConfigRequestTests > Update config serialize and deserialize using json object should be equal webhook() PASSED

UpdateNotificationConfigRequestTests > Update config should throw exception when invalid json object is passed() PASSED

UpdateNotificationConfigRequestTests > Update config serialize and deserialize transport object should be equal SmtpAccount() PASSED

UpdateNotificationConfigRequestTests > Update config serialize and deserialize using json object should be equal Email() PASSED

UpdateNotificationConfigRequestTests > Update config serialize and deserialize using json object should be equal chime() PASSED

UpdateNotificationConfigRequestTests > Update config serialize and deserialize using json object should be equal slack() PASSED

UpdateNotificationConfigRequestTests > Update config should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,193][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: feature_list, while parsing configuration
    [2024-06-11T13:41:25,193][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: extra_field_1, while parsing configuration
    [2024-06-11T13:41:25,193][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: extra_field_2, while parsing configuration
    [2024-06-11T13:41:25,193][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: extra_field_3, while parsing configuration

UpdateNotificationConfigRequestTests > Update config should safely ignore extra field in json object() PASSED

UpdateNotificationConfigRequestTests > Update config should deserialize json object using parser Chime() STANDARD_OUT
    [2024-06-11T13:41:25,194][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: feature_list, while parsing configuration

UpdateNotificationConfigRequestTests > Update config should deserialize json object using parser Chime() PASSED

UpdateNotificationConfigRequestTests > Update config should deserialize json object using parser Email() STANDARD_OUT
    [2024-06-11T13:41:25,194][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: feature_list, while parsing configuration

UpdateNotificationConfigRequestTests > Update config should deserialize json object using parser Email() PASSED

UpdateNotificationConfigRequestTests > Update config should deserialize json object using parser slack() STANDARD_OUT
    [2024-06-11T13:41:25,195][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: feature_list, while parsing configuration

UpdateNotificationConfigRequestTests > Update config should deserialize json object using parser slack() PASSED

UpdateNotificationConfigRequestTests > Update config should deserialize json object using parser SmtpAccount() STANDARD_OUT
    [2024-06-11T13:41:25,195][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: feature_list, while parsing configuration

UpdateNotificationConfigRequestTests > Update config should deserialize json object using parser SmtpAccount() PASSED

UpdateNotificationConfigRequestTests > Update config serialize and deserialize using json object should be equal microsoft Teams() PASSED

UpdateNotificationConfigRequestTests > Update config serialize and deserialize using json object should be equal EmailGroup() PASSED

UpdateNotificationConfigRequestTests > Update config serialize and deserialize transport object should be equal Chime() PASSED

UpdateNotificationConfigRequestTests > Update config serialize and deserialize transport object should be equal Email() PASSED

UpdateNotificationConfigRequestTests > Update config serialize and deserialize transport object should be equal Slack() PASSED

UpdateNotificationConfigRequestTests > Update config serialize and deserialize transport object should be equal Microsoft Teams() PASSED

UpdateNotificationConfigRequestTests > Update config serialize and deserialize transport object should be equal Webhook() PASSED

UpdateNotificationConfigRequestTests > Update config should deserialize json object using parser webhook() STANDARD_OUT
    [2024-06-11T13:41:25,199][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: feature_list, while parsing configuration

UpdateNotificationConfigRequestTests > Update config should deserialize json object using parser webhook() PASSED

UpdateNotificationConfigRequestTests > Update config should deserialize json object using parser Email Group() STANDARD_OUT
    [2024-06-11T13:41:25,200][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: feature_list, while parsing configuration

UpdateNotificationConfigRequestTests > Update config should deserialize json object using parser Email Group() PASSED

UpdateNotificationConfigResponseTests > Update response should deserialize json object using parser() PASSED

UpdateNotificationConfigResponseTests > Update response should throw exception when invalid json object is passed() PASSED

UpdateNotificationConfigResponseTests > Update response serialize and deserialize transport object should be equal() PASSED

UpdateNotificationConfigResponseTests > Update response should throw exception when configId is replace with configId2 in json object() STANDARD_OUT
    [2024-06-11T13:41:25,203][INFO ][o.o.c.n.a.UpdateNotificationConfigResponse] [[Test worker]] Unexpected field: config_id2, while parsing UpdateNotificationConfigResponse

UpdateNotificationConfigResponseTests > Update response should throw exception when configId is replace with configId2 in json object() PASSED

UpdateNotificationConfigResponseTests > Update response serialize and deserialize using json object should be equal() PASSED

UpdateNotificationConfigResponseTests > Update response should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,205][INFO ][o.o.c.n.a.UpdateNotificationConfigResponse] [[Test worker]] Unexpected field: extra_field_1, while parsing UpdateNotificationConfigResponse
    [2024-06-11T13:41:25,205][INFO ][o.o.c.n.a.UpdateNotificationConfigResponse] [[Test worker]] Unexpected field: extra_field_2, while parsing UpdateNotificationConfigResponse
    [2024-06-11T13:41:25,205][INFO ][o.o.c.n.a.UpdateNotificationConfigResponse] [[Test worker]] Unexpected field: extra_field_3, while parsing UpdateNotificationConfigResponse

UpdateNotificationConfigResponseTests > Update response should safely ignore extra field in json object() PASSED

AttachmentTests > Attachment Json parsing should throw exception if file_encoding is absent() PASSED

AttachmentTests > Attachment Json parsing should safely ignore extra fields() STANDARD_OUT
    [2024-06-11T13:41:25,207][INFO ][o.o.c.n.m.Attachment     ] [[Test worker]] Skipping Unknown field extra_field_1
    [2024-06-11T13:41:25,207][INFO ][o.o.c.n.m.Attachment     ] [[Test worker]] Skipping Unknown field extra_field_2
    [2024-06-11T13:41:25,207][INFO ][o.o.c.n.m.Attachment     ] [[Test worker]] Skipping Unknown field extra_field_3

AttachmentTests > Attachment Json parsing should safely ignore extra fields() PASSED

AttachmentTests > Attachment Object serialize and deserialize using transport should be equal() PASSED

AttachmentTests > Attachment Json parsing should throw exception if file_name is absent() PASSED

AttachmentTests > Attachment Json parsing should throw exception if file_data is absent() PASSED

AttachmentTests > Attachment Object serialize and deserialize using json should be equal() PASSED

AttachmentTests > Attachment Json parsing should safely ignore null content type() PASSED

ChannelListTests > Feature Channel List serialize and deserialize multiple object with default values should be equal() PASSED

ChannelListTests > Feature Channel List serialize and deserialize using json with multiple object should be equal() PASSED

ChannelListTests > Channel List should throw exception if channel_list is absent in json() PASSED

ChannelListTests > Feature Channel List should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,212][INFO ][o.o.c.n.m.SearchResults  ] [[Test worker]] Skipping Unknown field extra_field_1
    [2024-06-11T13:41:25,212][INFO ][o.o.c.n.m.SearchResults  ] [[Test worker]] Skipping Unknown field extra_field_2
    [2024-06-11T13:41:25,212][INFO ][o.o.c.n.m.SearchResults  ] [[Test worker]] Skipping Unknown field extra_field_3

ChannelListTests > Feature Channel List should safely ignore extra field in json object() PASSED

ChannelListTests > Feature Channel List serialize and deserialize with multiple object should be equal() PASSED

ChannelListTests > Feature Channel List serialize and deserialize using transport should be equal() PASSED

ChannelListTests > Feature Channel List serialize and deserialize using json should be equal() PASSED

ChannelListTests > Feature Channel List should safely fallback to default if startIndex, totalHits or totalHitRelation field absent in json object() PASSED

ChannelMessageTests > ChannelMessage Json parsing should throw exception if text_description is absent() PASSED

ChannelMessageTests > ChannelMessage Json parsing should safely ignore extra fields() STANDARD_OUT
    [2024-06-11T13:41:25,215][INFO ][o.o.c.n.m.ChannelMessage ] [[Test worker]] Skipping Unknown field extra_field_1
    [2024-06-11T13:41:25,215][INFO ][o.o.c.n.m.ChannelMessage ] [[Test worker]] Skipping Unknown field extra_field_2
    [2024-06-11T13:41:25,215][INFO ][o.o.c.n.m.ChannelMessage ] [[Test worker]] Skipping Unknown field extra_field_3

ChannelMessageTests > ChannelMessage Json parsing should safely ignore extra fields() PASSED

ChannelMessageTests > ChannelMessage Json parsing should throw exception if text_description is empty() PASSED

ChannelMessageTests > ChannelMessage Json parsing should safely ignore both missing html_description and attachment() PASSED

ChannelMessageTests > ChannelMessage Object serialize and deserialize using json should be equal() PASSED

ChannelMessageTests > ChannelMessage Object serialize and deserialize using transport should be equal() PASSED

ChannelMessageTests > ChannelMessage Json parsing should safely ignore missing html description() PASSED

ChannelMessageTests > ChannelMessage Json parsing should safely ignore missing attachment() PASSED

ChannelTests > Channel Object serialize and deserialize using json should be equal() PASSED

ChannelTests > Channel Object serialize and deserialize using transport should be equal() PASSED

ChannelTests > Channel Json parsing should throw exception if config_id is absent() PASSED

ChannelTests > Channel Json parsing should throw exception if name is absent() PASSED

ChannelTests > Channel Json parsing should safely parse if is_enabled is absent() PASSED

ChannelTests > Channel Json parsing should safely parse if description is absent() PASSED

ChannelTests > Channel Json parsing should throw exception if name is empty() PASSED

ChannelTests > Channel Json parsing should safely ignore extra fields() STANDARD_OUT
    [2024-06-11T13:41:25,222][INFO ][o.o.c.n.m.Channel        ] [[Test worker]] Unexpected field: extra_field_1, while parsing Channel
    [2024-06-11T13:41:25,222][INFO ][o.o.c.n.m.Channel        ] [[Test worker]] Unexpected field: extra_field_2, while parsing Channel
    [2024-06-11T13:41:25,222][INFO ][o.o.c.n.m.Channel        ] [[Test worker]] Unexpected field: extra_field_3, while parsing Channel

ChannelTests > Channel Json parsing should safely ignore extra fields() PASSED

ChannelTests > Channel Json parsing should throw exception if config_id is empty() PASSED

ChannelTests > Channel Json parsing should safely ignore unknown config type() PASSED

ChannelTests > Channel Json parsing should throw exception if config_type is absent() PASSED

ChimeTests > Chime should throw exception when invalid json object is passed() PASSED

ChimeTests > Chime serialize and deserialize transport object should be equal() PASSED

ChimeTests > Chime should throw exception when url is replace with url2 in json object() STANDARD_OUT
    [2024-06-11T13:41:25,229][INFO ][o.o.c.n.m.Chime          ] [[Test worker]] Unexpected field: url2, while parsing Chime destination

ChimeTests > Chime should throw exception when url is replace with url2 in json object() PASSED

ChimeTests > Chime should deserialize json object using parser() PASSED

ChimeTests > Chime should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,232][INFO ][o.o.c.n.m.Chime          ] [[Test worker]] Unexpected field: another, while parsing Chime destination

ChimeTests > Chime should safely ignore extra field in json object() PASSED

ChimeTests > Chime serialize and deserialize using json object should be equal() PASSED

ChimeTests > Chime should throw exception when url is not proper() PASSED

ChimeTests > Chime should throw exception when url protocol is not https or http() PASSED

ConfigTypeTests > fromTagOrDefault should return corresponding enum() PASSED

ConfigTypeTests > toString should return tag() PASSED

ConfigTypeTests > EnumParser fromTagOrDefault should return corresponding enum() PASSED

DeliveryStatusTests > DeliveryStatus should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,239][INFO ][o.o.c.n.m.DeliveryStatus ] [[Test worker]] Unexpected field: extra, while parsing deliveryStatus

DeliveryStatusTests > DeliveryStatus should safely ignore extra field in json object() PASSED

DeliveryStatusTests > DeliveryStatus serialize and deserialize using json should be equal() PASSED

DeliveryStatusTests > DeliveryStatus should throw exception when invalid json object is passed() PASSED

DeliveryStatusTests > DeliveryStatus serialize and deserialize should be equal() PASSED

EmailGroupTests > EmailGroup should throw exception when invalid json object is passed() PASSED

EmailGroupTests > EmailGroup serialize and deserialize transport object should be equal() PASSED

EmailGroupTests > EmailGroup serialize and deserialize using json object should be equal() PASSED

EmailGroupTests > EmailGroup should throw exception when recipients is replaced with recipients2 in json object() STANDARD_OUT
    [2024-06-11T13:41:25,245][INFO ][o.o.c.n.m.EmailGroup     ] [[Test worker]] Unexpected field: recipient_list2, while parsing EmailGroup

EmailGroupTests > EmailGroup should throw exception when recipients is replaced with recipients2 in json object() PASSED

EmailGroupTests > EmailGroup should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,247][INFO ][o.o.c.n.m.EmailGroup     ] [[Test worker]] Unexpected field: extra_field_1, while parsing EmailGroup
    [2024-06-11T13:41:25,247][INFO ][o.o.c.n.m.EmailGroup     ] [[Test worker]] Unexpected field: extra_field_2, while parsing EmailGroup
    [2024-06-11T13:41:25,247][INFO ][o.o.c.n.m.EmailGroup     ] [[Test worker]] Unexpected field: extra_field_3, while parsing EmailGroup

EmailGroupTests > EmailGroup should safely ignore extra field in json object() PASSED

EmailGroupTests > EmailGroup should deserialize json object using parser() PASSED

EmailRecipientStatusTests > EmailRecipientStatus serialize and deserialize should be equal() PASSED

EmailRecipientStatusTests > EmailRecipientStatus should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,252][INFO ][o.o.c.n.m.EmailRecipientStatus] [[Test worker]] Unexpected field: extra, while parsing Email Recipient Status

EmailRecipientStatusTests > EmailRecipientStatus should safely ignore extra field in json object() PASSED

EmailRecipientStatusTests > EmailRecipientStatus serialize and deserialize using json should be equal() PASSED

EmailRecipientStatusTests > EmailRecipientStatus should throw exception when invalid json object is passed() PASSED

EmailRecipientStatusTests > EmailRecipientStatus should throw exception for invalid recipient() PASSED

EmailRecipientTests > EmailRecipient should throw exception when invalid json object is passed() PASSED

EmailRecipientTests > EmailRecipient should throw exception when recipients is replaced with recipients2 in json object() STANDARD_OUT
    [2024-06-11T13:41:25,259][INFO ][o.o.c.n.m.EmailRecipient ] [[Test worker]] Unexpected field: recipient2, while parsing EmailRecipient

EmailRecipientTests > EmailRecipient should throw exception when recipients is replaced with recipients2 in json object() PASSED

EmailRecipientTests > EmailRecipient serialize and deserialize transport object should be equal() PASSED

EmailRecipientTests > EmailRecipient should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,261][INFO ][o.o.c.n.m.EmailRecipient ] [[Test worker]] Unexpected field: extra_field_1, while parsing EmailRecipient
    [2024-06-11T13:41:25,261][INFO ][o.o.c.n.m.EmailRecipient ] [[Test worker]] Unexpected field: extra_field_2, while parsing EmailRecipient
    [2024-06-11T13:41:25,261][INFO ][o.o.c.n.m.EmailRecipient ] [[Test worker]] Unexpected field: extra_field_3, while parsing EmailRecipient

EmailRecipientTests > EmailRecipient should safely ignore extra field in json object() PASSED

EmailRecipientTests > EmailRecipient should deserialize json object using parser() PASSED

EmailRecipientTests > EmailRecipient serialize and deserialize using json object should be equal() PASSED

EmailRecipientTests > EmailRecipient should accept valid email address() PASSED

EmailRecipientTests > EmailRecipient should throw exception for invalid email address() PASSED

EmailTests > Email should deserialize json object using parser() PASSED

EmailTests > Email should throw exception when invalid json object is passed() PASSED

EmailTests > Email should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,273][INFO ][o.o.c.n.m.Email          ] [[Test worker]] Unexpected field: recipient_list2, while parsing Email
    [2024-06-11T13:41:25,273][INFO ][o.o.c.n.m.Email          ] [[Test worker]] Unexpected field: email_group_id_list2, while parsing Email
    [2024-06-11T13:41:25,273][INFO ][o.o.c.n.m.Email          ] [[Test worker]] Unexpected field: another, while parsing Email

EmailTests > Email should safely ignore extra field in json object() PASSED

EmailTests > Email serialize and deserialize transport object should be equal() PASSED

EmailTests > Email should throw exception when emailAccountID is replaced with emailAccountID2 in json object() STANDARD_OUT
    [2024-06-11T13:41:25,275][INFO ][o.o.c.n.m.Email          ] [[Test worker]] Unexpected field: email_account_id2, while parsing Email

EmailTests > Email should throw exception when emailAccountID is replaced with emailAccountID2 in json object() PASSED

EmailTests > Email should accept without defaultRecipients and defaultEmailGroupIds in json object() PASSED

EmailTests > Email serialize and deserialize using json object should be equal() PASSED

EventSourceTests > Event source serialize and deserialize using json should be equal() PASSED

EventSourceTests > Event source throw exception if name is empty() PASSED

EventSourceTests > Event source should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,278][INFO ][o.o.c.n.m.EventSource    ] [[Test worker]] Unexpected field: feature, while parsing EventSource
    [2024-06-11T13:41:25,278][INFO ][o.o.c.n.m.EventSource    ] [[Test worker]] Unexpected field: extra_field_1, while parsing EventSource
    [2024-06-11T13:41:25,278][INFO ][o.o.c.n.m.EventSource    ] [[Test worker]] Unexpected field: extra_field_2, while parsing EventSource
    [2024-06-11T13:41:25,278][INFO ][o.o.c.n.m.EventSource    ] [[Test worker]] Unexpected field: extra_field_3, while parsing EventSource

EventSourceTests > Event source should safely ignore extra field in json object() PASSED

EventSourceTests > Event source serialize and deserialize should be equal() PASSED

EventSourceTests > Event source should safely accepts unknown feature type in json object() STANDARD_OUT
    [2024-06-11T13:41:25,279][INFO ][o.o.c.n.m.EventSource    ] [[Test worker]] Unexpected field: feature, while parsing EventSource

EventSourceTests > Event source should safely accepts unknown feature type in json object() PASSED

EventStatusTests > Event throw exception if deliveryStatus is empty for config type Chime() PASSED

EventStatusTests > Event throw exception if deliveryStatus is empty for config type Slack() PASSED

EventStatusTests > Event should throw exception when invalid json object is passed() PASSED

EventStatusTests > Event throw exception if deliveryStatus is empty for config type Webhook() PASSED

EventStatusTests > Event Status serialize and deserialize using json should be equal() PASSED

EventStatusTests > Event Status should throw exception when config type is email with empty emailRecipientList() PASSED

EventStatusTests > Event throw exception if emailRecipientStatus is empty for config type Email() PASSED

EventStatusTests > Event throw exception if deliveryStatus is empty for config type MicrosoftTeams() PASSED

EventStatusTests > Event Status serialize and deserialize should be equal() PASSED

EventStatusTests > Event Status should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,286][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: extra_field_1, while parsing EventStatus
    [2024-06-11T13:41:25,286][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: extra_field_2, while parsing EventStatus
    [2024-06-11T13:41:25,286][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: extra_field_3, while parsing EventStatus

EventStatusTests > Event Status should safely ignore extra field in json object() PASSED

FilterConfigListTests > Search result should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,287][INFO ][o.o.c.n.m.SearchResults  ] [[Test worker]] Skipping Unknown field extra_field_1
    [2024-06-11T13:41:25,287][INFO ][o.o.c.n.m.SearchResults  ] [[Test worker]] Skipping Unknown field extra_field_2
    [2024-06-11T13:41:25,287][INFO ][o.o.c.n.m.SearchResults  ] [[Test worker]] Skipping Unknown field extra_field_3

FilterConfigListTests > Search result should safely ignore extra field in json object() PASSED

FilterConfigListTests > Search result serialize and deserialize with multiple config object should be equal() PASSED

FilterConfigListTests > Search result should throw exception if channelList is absent in json() PASSED

FilterConfigListTests > Search result serialize and deserialize with config object should be equal() PASSED

FilterConfigListTests > Search result serialize and deserialize using json config object should be equal() PASSED

FilterConfigListTests > Search result should safely fallback to default if startIndex, totalHits or totalHitRelation field absent in json object() PASSED

FilterConfigListTests > Search result serialize and deserialize using json with multiple config object should be equal() PASSED

FilterConfigListTests > Search result should use isEnabled=true if absent in json object() PASSED

FilterConfigTests > Config throw exception if configId is empty() PASSED

FilterConfigTests > Config serialize and deserialize using json object with default isEnabled flag should be equal() PASSED

FilterConfigTests > Config serialize and deserialize using json object with isEnabled=false should be equal() PASSED

FilterConfigTests > Config serialize and deserialize with default isEnabled flag should be equal() PASSED

FilterConfigTests > Config serialize and deserialize with isEnabled=false should be equal() PASSED

FilterConfigTests > Config throw exception if name is empty() PASSED

FilterConfigTests > Config should safely ignore unknown config type in json object() PASSED

FilterConfigTests > Config should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,294][INFO ][o.o.c.n.m.Channel        ] [[Test worker]] Unexpected field: extra_field_1, while parsing Channel
    [2024-06-11T13:41:25,294][INFO ][o.o.c.n.m.Channel        ] [[Test worker]] Unexpected field: extra_field_2, while parsing Channel
    [2024-06-11T13:41:25,294][INFO ][o.o.c.n.m.Channel        ] [[Test worker]] Unexpected field: extra_field_3, while parsing Channel

FilterConfigTests > Config should safely ignore extra field in json object() PASSED

MethodTypeTests > fromTagOrDefault should return corresponding enum() PASSED

MethodTypeTests > toString should return tag() PASSED

MethodTypeTests > EnumParser fromTagOrDefault should return corresponding enum() PASSED

MicrosoftTeamsTests > Microsoft Teams should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,297][INFO ][o.o.c.n.m.MicrosoftTeams ] [[Test worker]] Unexpected field: another, while parsing MicrosoftTeams destination

MicrosoftTeamsTests > Microsoft Teams should safely ignore extra field in json object() PASSED

MicrosoftTeamsTests > Microsoft Teams should throw exception when url protocol is not https or http() PASSED

MicrosoftTeamsTests > Microsoft Teams serialize and deserialize using json object should be equal() PASSED

MicrosoftTeamsTests > Microsoft Teams should deserialize json object using parser() PASSED

MicrosoftTeamsTests > Microsoft Teams should throw exception when invalid json object is passed() PASSED

MicrosoftTeamsTests > Microsoft Teams should throw exception when url is not proper() PASSED

MicrosoftTeamsTests > Microsoft Teams serialize and deserialize transport object should be equal() PASSED

MicrosoftTeamsTests > Microsoft Teams should throw exception when url is replace with url2 in json object() STANDARD_OUT
    [2024-06-11T13:41:25,303][INFO ][o.o.c.n.m.MicrosoftTeams ] [[Test worker]] Unexpected field: url2, while parsing MicrosoftTeams destination

MicrosoftTeamsTests > Microsoft Teams should throw exception when url is replace with url2 in json object() PASSED

NotificationConfigInfoTests > Config info should throw exception if configId is empty() PASSED

NotificationConfigInfoTests > Config info should throw exception if createdTimeMs is absent in json() STANDARD_OUT
    [2024-06-11T13:41:25,306][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: feature_list, while parsing configuration

NotificationConfigInfoTests > Config info should throw exception if createdTimeMs is absent in json() PASSED

NotificationConfigInfoTests > Config info serialize and deserialize using json config object should be equal() PASSED

NotificationConfigInfoTests > Config info should throw exception if lastUpdatedTimeMs is absent in json() STANDARD_OUT
    [2024-06-11T13:41:25,308][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: feature_list, while parsing configuration

NotificationConfigInfoTests > Config info should throw exception if lastUpdatedTimeMs is absent in json() PASSED

NotificationConfigInfoTests > Config info should throw exception if configId is absent in json() STANDARD_OUT
    [2024-06-11T13:41:25,310][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: feature_list, while parsing configuration

NotificationConfigInfoTests > Config info should throw exception if configId is absent in json() PASSED

NotificationConfigInfoTests > Config info should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,311][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: feature_list, while parsing configuration
    [2024-06-11T13:41:25,311][INFO ][o.o.c.n.m.NotificationConfigInfo] [[Test worker]] Unexpected field: extra_field_1, while parsing configuration
    [2024-06-11T13:41:25,311][INFO ][o.o.c.n.m.NotificationConfigInfo] [[Test worker]] Unexpected field: extra_field_2, while parsing configuration
    [2024-06-11T13:41:25,311][INFO ][o.o.c.n.m.NotificationConfigInfo] [[Test worker]] Unexpected field: extra_field_3, while parsing configuration

NotificationConfigInfoTests > Config info should safely ignore extra field in json object() PASSED

NotificationConfigInfoTests > Config info serialize and deserialize with config object should be equal() PASSED

NotificationConfigInfoTests > Config info should throw exception if notificationConfig is absent in json() PASSED

NotificationConfigSearchResultsTests > Search result should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,314][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: feature_list, while parsing configuration
    [2024-06-11T13:41:25,314][INFO ][o.o.c.n.m.SearchResults  ] [[Test worker]] Skipping Unknown field extra_field_1
    [2024-06-11T13:41:25,314][INFO ][o.o.c.n.m.SearchResults  ] [[Test worker]] Skipping Unknown field extra_field_2
    [2024-06-11T13:41:25,314][INFO ][o.o.c.n.m.SearchResults  ] [[Test worker]] Skipping Unknown field extra_field_3

NotificationConfigSearchResultsTests > Search result should safely ignore extra field in json object() PASSED

NotificationConfigSearchResultsTests > Search result serialize and deserialize with multiple config default values should be equal() PASSED

NotificationConfigSearchResultsTests > Search result serialize and deserialize with multiple config object should be equal() PASSED

NotificationConfigSearchResultsTests > Search result should throw exception if notificationConfigs is absent in json() PASSED

NotificationConfigSearchResultsTests > Search result serialize and deserialize with config object should be equal() PASSED

NotificationConfigSearchResultsTests > Search result serialize and deserialize using json config object should be equal() PASSED

NotificationConfigSearchResultsTests > Search result should safely fallback to default if startIndex, totalHits or totalHitRelation field absent in json object() STANDARD_OUT
    [2024-06-11T13:41:25,317][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: feature_list, while parsing configuration

NotificationConfigSearchResultsTests > Search result should safely fallback to default if startIndex, totalHits or totalHitRelation field absent in json object() PASSED

NotificationConfigSearchResultsTests > Search result serialize and deserialize using json with multiple config object should be equal() PASSED

NotificationConfigTests > Config serialize and deserialize with json smtpAccount object should be equal() PASSED

NotificationConfigTests > Config should safely accepts unknown feature type in json object() STANDARD_OUT
    [2024-06-11T13:41:25,319][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: feature_list, while parsing configuration

NotificationConfigTests > Config should safely accepts unknown feature type in json object() PASSED

NotificationConfigTests > Config serialize and deserialize with smtpAccount object should be equal() PASSED

NotificationConfigTests > Config serialize and deserialize with webhook object should be equal() PASSED

NotificationConfigTests > Config serialize and deserialize with json emailGroup object should be equal() PASSED

NotificationConfigTests > Config serialize and deserialize with emailGroup object should be equal() PASSED

NotificationConfigTests > Config serialize and deserialize with slack object should be equal() PASSED

NotificationConfigTests > Config serialize and deserialize with json microsoft teams object should be equal() PASSED

NotificationConfigTests > Config serialize and deserialize with email object should be equal() PASSED

NotificationConfigTests > Config serialize and deserialize with json email object should be equal() PASSED

NotificationConfigTests > Config serialize and deserialize with json webhook object should be equal() PASSED

NotificationConfigTests > Config should safely ignore unknown config type in json object() STANDARD_OUT
    [2024-06-11T13:41:25,324][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Some config field not recognized
    [2024-06-11T13:41:25,324][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: feature_list, while parsing configuration
    [2024-06-11T13:41:25,324][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: chime, while parsing configuration
    [2024-06-11T13:41:25,324][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: webhook, while parsing configuration
    [2024-06-11T13:41:25,324][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: new_config1, while parsing configuration
    [2024-06-11T13:41:25,325][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Unexpected field: new_config2, while parsing configuration
    [2024-06-11T13:41:25,325][INFO ][o.o.c.n.m.NotificationConfig] [[Test worker]] Some config field not recognized

NotificationConfigTests > Config should safely ignore unknown config type in json object() PASSED

NotificationConfigTests > Config serialize and deserialize with chime object should be equal() PASSED

NotificationConfigTests > Config serialize and deserialize with json chime object should be equal() PASSED

NotificationConfigTests > Config serialize and deserialize using json slack object should be equal() PASSED

NotificationConfigTests > Config serialize and deserialize with microsoft teams object should be equal() PASSED

NotificationEventTests > Notification event throw exception if status_list is absent() STANDARD_OUT
    [2024-06-11T13:41:25,328][INFO ][o.o.c.n.m.EventSource    ] [[Test worker]] Unexpected field: feature, while parsing EventSource

NotificationEventTests > Notification event throw exception if status_list is absent() PASSED

NotificationEventTests > Notification event serialize and deserialize using json should be equal() PASSED

NotificationEventTests > Notification event throw exception if status_list is empty() STANDARD_OUT
    [2024-06-11T13:41:25,330][INFO ][o.o.c.n.m.EventSource    ] [[Test worker]] Unexpected field: feature, while parsing EventSource

NotificationEventTests > Notification event throw exception if status_list is empty() PASSED

NotificationEventTests > Notification event should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,330][INFO ][o.o.c.n.m.EventSource    ] [[Test worker]] Unexpected field: feature, while parsing EventSource
    [2024-06-11T13:41:25,330][INFO ][o.o.c.n.m.NotificationEvent] [[Test worker]] Unexpected field: extra_field_1, while parsing notification event
    [2024-06-11T13:41:25,330][INFO ][o.o.c.n.m.NotificationEvent] [[Test worker]] Unexpected field: extra_field_2, while parsing notification event
    [2024-06-11T13:41:25,331][INFO ][o.o.c.n.m.NotificationEvent] [[Test worker]] Unexpected field: extra_field_3, while parsing notification event

NotificationEventTests > Notification event should safely ignore extra field in json object() PASSED

NotificationEventTests > Notification event throw exception if event source is absent() PASSED

NotificationEventTests > Notification event serialize and deserialize should be equal() PASSED

SesAccountTests > SES should deserialize json object using parser() PASSED

SesAccountTests > SES should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,334][INFO ][o.o.c.n.m.SesAccount     ] [[Test worker]] Unexpected field: extra_field_1, while parsing SesAccount
    [2024-06-11T13:41:25,334][INFO ][o.o.c.n.m.SesAccount     ] [[Test worker]] Unexpected field: extra_field_2, while parsing SesAccount
    [2024-06-11T13:41:25,334][INFO ][o.o.c.n.m.SesAccount     ] [[Test worker]] Unexpected field: extra_field_3, while parsing SesAccount

SesAccountTests > SES should safely ignore extra field in json object() PASSED

SesAccountTests > SES should throw exception when from_address is replace with from_address2 in json object() STANDARD_OUT
    [2024-06-11T13:41:25,335][INFO ][o.o.c.n.m.SesAccount     ] [[Test worker]] Unexpected field: from_address2, while parsing SesAccount

SesAccountTests > SES should throw exception when from_address is replace with from_address2 in json object() PASSED

SesAccountTests > SES should throw exception if empty region() PASSED

SesAccountTests > SES should throw exception when region is replace with region2 in json object() STANDARD_OUT
    [2024-06-11T13:41:25,337][INFO ][o.o.c.n.m.SesAccount     ] [[Test worker]] Unexpected field: region2, while parsing SesAccount

SesAccountTests > SES should throw exception when region is replace with region2 in json object() PASSED

SesAccountTests > SES should deserialize json object will null role_arn using parser() PASSED

SesAccountTests > SES should throw exception when email id is invalid() PASSED

SesAccountTests > SES serialize and deserialize using json object should be equal with null roleArn() PASSED

SesAccountTests > SES should deserialize json object will missing role_arn using parser() PASSED

SesAccountTests > SES should throw exception if invalid role ARN() PASSED

SesAccountTests > SES serialize and deserialize transport object should be equal() PASSED

SesAccountTests > SES serialize and deserialize using json object should be equal() PASSED

SesAccountTests > SES should throw exception when invalid json object is passed() PASSED

SeverityTypeTests > fromTagOrDefault should return corresponding enum() PASSED

SeverityTypeTests > toString should return tag() PASSED

SeverityTypeTests > EnumParser fromTagOrDefault should return corresponding enum() PASSED

SlackTests > Slack should throw exception when url is replace with url2 in json object() STANDARD_OUT
    [2024-06-11T13:41:25,346][INFO ][o.o.c.n.m.Slack          ] [[Test worker]] Unexpected field: url2, while parsing Slack destination

SlackTests > Slack should throw exception when url is replace with url2 in json object() PASSED

SlackTests > Slack serialize and deserialize transport object should be equal() PASSED

SlackTests > Slack should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,348][INFO ][o.o.c.n.m.Slack          ] [[Test worker]] Unexpected field: another, while parsing Slack destination

SlackTests > Slack should safely ignore extra field in json object() PASSED

SlackTests > Slack should throw exception when url is not proper() PASSED

SlackTests > Slack serialize and deserialize using json object should be equal() PASSED

SlackTests > Slack should throw exception when url protocol is not https or http() PASSED

SlackTests > Slack should throw exception when invalid json object is passed() PASSED

SlackTests > Slack should deserialize json object using parser() PASSED

SmtpAccountTests > SmtpAccount should throw exception when email id is invalid() PASSED

SmtpAccountTests > SmtpAccount should deserialize json object using parser() PASSED

SmtpAccountTests > SmtpAccount serialize and deserialize using json object should be equal() PASSED

SmtpAccountTests > SmtpAccount should throw exception when invalid json object is passed() PASSED

SmtpAccountTests > SmtpAccount serialize and deserialize transport object should be equal() PASSED

SmtpAccountTests > SmtpAccount should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,358][INFO ][o.o.c.n.m.SmtpAccount    ] [[Test worker]] Unexpected field: extra_field_1, while parsing SmtpAccount
    [2024-06-11T13:41:25,359][INFO ][o.o.c.n.m.SmtpAccount    ] [[Test worker]] Unexpected field: extra_field_2, while parsing SmtpAccount

SmtpAccountTests > SmtpAccount should safely ignore extra field in json object() PASSED

SnsTests > SNS serialize and deserialize using json object should be equal() PASSED

SnsTests > SNS should throw exception if empty topic() PASSED

SnsTests > SNS should throw exception if invalid role ARN() PASSED

SnsTests > SNS should throw exception when invalid json object is passed() PASSED

SnsTests > SNS serialize and deserialize transport object should be equal() PASSED

SnsTests > test SNS correctly validates SNS FIFO topic ARN() PASSED

SnsTests > SNS should deserialize json object using parser() PASSED

SnsTests > SNS should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,364][INFO ][o.o.c.n.m.Sns            ] [[Test worker]] Unexpected field: another, while parsing SNS destination

SnsTests > SNS should safely ignore extra field in json object() PASSED

SnsTests > SNS should throw exception when arn is replace with arn2 in json object() STANDARD_OUT
    [2024-06-11T13:41:25,364][INFO ][o.o.c.n.m.Sns            ] [[Test worker]] Unexpected field: topic_arn2, while parsing SNS destination

SnsTests > SNS should throw exception when arn is replace with arn2 in json object() PASSED

SnsTests > SNS should throw exception if invalid topic ARN() PASSED

WebhookTests > Webhook serialize and deserialize transport object should be equal() PASSED

WebhookTests > Webhook should safely ignore extra field in json object() STANDARD_OUT
    [2024-06-11T13:41:25,367][INFO ][o.o.c.n.m.Webhook        ] [[Test worker]] Unexpected field: another, while parsing Webhook destination

WebhookTests > Webhook should safely ignore extra field in json object() PASSED

WebhookTests > Webhook should throw exception when url is not proper() PASSED

WebhookTests > Webhook should deserialize json object using parser() PASSED

WebhookTests > Webhook should throw exception when invalid json object is passed() PASSED

WebhookTests > Webhook should throw exception when url is replace with url2 in json object() STANDARD_OUT
    [2024-06-11T13:41:25,372][INFO ][o.o.c.n.m.Webhook        ] [[Test worker]] Unexpected field: url2, while parsing Webhook destination

WebhookTests > Webhook should throw exception when url is replace with url2 in json object() PASSED

WebhookTests > Webhook should throw exception when url protocol is not https or http() PASSED

WebhookTests > Webhook serialize and deserialize using json object should be equal() PASSED

ConfigPropertiesTests > Validate config data parse EmailGroup() PASSED

ConfigPropertiesTests > Validate config property reader webhook() PASSED

ConfigPropertiesTests > Validate config data parse SmtpAccount() PASSED

ConfigPropertiesTests > Validate config property reader SmtpAccount() PASSED

ConfigPropertiesTests > Validate config data parse chime() PASSED

ConfigPropertiesTests > Validate config data parse slack() PASSED

ConfigPropertiesTests > Validate config property reader Microsoft Teams() PASSED

ConfigPropertiesTests > Validate config data parse Microsoft Teams() PASSED

ConfigPropertiesTests > Validate config data parse webhook() PASSED

ConfigPropertiesTests > Validate config property reader chime() PASSED

ConfigPropertiesTests > Validate config property reader email() PASSED

ConfigPropertiesTests > Validate config property reader slack() PASSED

ConfigPropertiesTests > Validate config property reader EmailGroup() PASSED

Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/8.4/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.


Latest changes broke several databases on different servers

I used pgcompacttable on Windows with PSQL versions 9.4 and 11 for a long time. Everything went smooth with version from 2020-09-01
Yesterday I tried updated version (2021-09-10) and got few broken databases on different servers.
ERROR: could not open relation with oid
I have log from only one server. At first glance it doesn't have anything interesting, no errors. On a second server log had few "SQL errors" which never occurred before.
Please revert latest changes.
Unfortunately I'm unable to help with further testing and most likely would just use previous version.
Thanks.

I need more details.

could not open relation with oid

It doesn't seem to be related to anything that pgcompacttable can do.

That can't be concupiscence on 2 different servers. Database broke exactly after pgcompacttable. One of the was restored with REINDEX in PGAdmin 4.

Details are still needed.

ERROR: could not open relation with oid

What is the OID? This is a low level postgresql error. pgcompacttable doesn't do anything at such a low level. We use high-level regular SQL commands only.
In response to what actions does the DBMS return this error?

few "SQL errors"

Which exactly?

Errors is from an accounting program 1c: Enterprise. Errors showed durring log-in. I don't have any more information except log from server where database was restored using REINDEX.
Log with "SQL error" where I was unable to restore database, is unavailable right now. I can't recall exact phrase, something about table (like it's already exist or moved).

Well known, hmm, thing, let's call it that. So you are using a fork and not vanilla postgresql? This definitely needs to be mentioned.
In normal PostgreSQL, the error message "could not open relation with oid" contains the exact number. The database server log will also contain text of the query which gives this error.

If that's useful there is OID number on a broken server
ERROR: could not open relation with OID 30181568
On restored server I still have PSQL log. There's some personal so I would like only to share some parts of it (log itself has a lot of repeated lines anyway)

< 2021-09-21 18:00:14.298 EEST >ERROR:  could not open relation with OID 530497
< 2021-09-21 18:00:14.298 EEST >STATEMENT:  SELECT
'\000\000\0011'::bytea,
T1._IDRRef
FROM _Document305 T1
WHERE ((T1._Fld723 = CAST(0 AS NUMERIC))) AND ((T1._Date_Time >= '2021-03-05 00:00:00'::timestamp) AND (T1._Date_Time <= '2021-12-29 23:59:59'::timestamp) AND (T1._Fld7844 = '161'::mvarchar))
UNION ALL SELECT
'\000\000H\314'::bytea,
T2._IDRRef
FROM _Document18636 T2
WHERE ((T2._Fld723 = CAST(0 AS NUMERIC))) AND ((T2._Date_Time >= '2021-03-05 00:00:00'::timestamp) AND (T2._Date_Time <= '2021-12-29 23:59:59'::timestamp) AND (T2._Fld18685 = '161'::mvarchar))
< 2021-09-21 18:00:14.303 EEST >WARNING:  there is no transaction in progress

So I tried previous version 1.0.10 (2020-09-01) with restored (with REINDEX) database
It was launched with --force switch.
pgcompacttable outputs a lot of errors similar to what I've seen on a different server
[Wed Sep 22 20:56:20 2021] (database_name) It is recommended to set ionice -c 3 for pgcompacttable: ionice -c 3 -p 6340
[Wed Sep 22 20:56:22 2021] (database_name) Handling tables. Attempt 1
[Wed Sep 22 20:57:21 2021] (database_name:public._accumrg15387) SQL Error: ERROR:  type "_accumrg15387_bydims15401_rtrn" already exists
[Wed Sep 22 20:57:21 2021] (database_name:public._accumrg15387)
[Wed Sep 22 20:57:21 2021] (database_name:public._accumrg15693) SQL Error: ERROR:  relation "pgcompact_index_5336" already exists
[Wed Sep 22 20:57:21 2021] (database_name:public._accumrg15693) SQL Error: ERROR:  type "_accumrg15693_byrecorder_rn" already exists
[Wed Sep 22 20:57:21 2021] (database_name:public._accumrg15693)

So I tried again version 1.0.10 (2020-09-01) on the proper database (restored from backup) and one again it worked perfectly. Guess I'll just stick with that version for a while...


Traffic to localhost isn't proxied

Hello,
by default, traffic to localhost, <IP_ADDRESS>, ... isn't proxied.
That can be fixed by adding the following line to the chrome script:
"--proxy-bypass-list=<-loopback>",

Details at https://chromium.googlesource.com/chromium/src/+/master/net/docs/proxy.md#Bypass-rule_Subtract-implicit-rules

Does this break functionality such as accessing http://burp/ ?

No, it doesn't. Only explicitly accessing http://<IP_ADDRESS>/ is affected


[DISCUSSION] BeamLocations are not compatible with iOS navigation system

Hey there, I would like to raise a discussion about Beamer structural design when looking from iOS users/devs perspective.
Beamer mainly works by splitting the application "flows" into different locations to organize the whole navigation workflow. The problem that we realized after a few months using Beamer, is that the way how locations are handled in the navigation stack "breaks" the way how native iOS apps handle with navigation. Basically when navigating between different BeamerLocations, the previous location is cached by Beamer but REMOVED from the Widgets tree. In Flutter's navigator perspective, there's no place "to go back", since the location pages were removed. This basically kills an iOS native way of handling navigations, which is the swipe left-to-right gesture to go back to the previous page:

iOS Swipe to go back
https://user-images.githubusercontent.com/11745745/151369604-2ab2f9eb-8c56-474c-8e02-3cfd65ccf14e.mp4

To preserve this iOS native behavior, it would be necessary to add all pages in the same BeamLocation. As an example, consider that we're creating the iOS Settings native app using Flutter + Beamer. All the pages from the app would have to be added in the same BeamLocation to keep the swipe to go back gesture, and this definitely shouldn't be the correct solution.
I'm not sure if this is an architectural design problem from Beamer or I am missing something really obvious here, but we are trying to achieve a decent BeamLocation separation while preserving the native OS behavior.

Hey.
iOS swipe gesture works as expected when using Beamer.

The swipe gesture does a pop, which pops the top-most page from the current stack of pages, i.e. Navigator.pages. When using BeamLocations, these are the pages returned by buildPages.
The purpose of BeamLocations is exactly to separate different page stacks so it is not expected to be able to "pop from one BeamLocation to the other". I put this in quotation marks because pop is a concept related to a single page stack, not multiple (as each BeamLocation represents one page stack).
Organization of BeamLocations and implementation of buildPages is a sensitive topic that requires much care and insight into product goal. All pages that should be "connected via pop" should be in the same BeamLocation. It is common to have the same page in many BeamLocations, e.g. a HomePage might be the bottom page at every buildPages (and will persist its state even when BeamLocation is replaced by another BeamLocation that also has that HomePage at the same position in the stack)
To illustrate this, let's say we have 2 (very similar and familiar) BeamLocations;
class BooksBeamLocation extends BeamLocation<BeamState> {
  @override
  List<Pattern> get pathPatterns => ['/', '/books', '/books/:bookId'];

  @override
  List<BeamPage> buildPages(BuildContext context, BeamState state) {
    final bookId = state.pathParameters['bookId'];
    return [
      const BeamPage(
        key: ValueKey('home'),
        child: HomeScreen(),
      ),
      if (state.pathPatternSegments.contains('books'))
        const BeamPage(
          key: ValueKey('books'),
          child: BooksScreen(),
      ),
      if (bookId != null)
        const BeamPage(
          key: ValueKey('books-$bookId'),
          child: BookDetailsScreen(bookId: bookId),
      ),
    ];
  }
}

class ArticlesBeamLocation extends BeamLocation<BeamState> {
  @override
  List<Pattern> get pathPatterns => ['/', '/articles', '/articles/:articleId'];

  @override
  List<BeamPage> buildPages(BuildContext context, BeamState state) {
    final articleId = state.pathParameters['articleId'];
    return [
      const BeamPage(
        key: ValueKey('home'),
        child: HomeScreen(),
      ),
      if (state.pathPatternSegments.contains('articles'))
        const BeamPage(
          key: ValueKey('articles'),
          child: ArticlesScreen(),
      ),
      if (bookId != null)
        const BeamPage(
          key: ValueKey('articles-$articleId'),
          child: ArticleDetailsScreen(articleId: articleId),
      ),
    ];
  }
}

Every time we receive an URI, either from platform or by calling any of the beaming functions, we have to decide which pages we need to put into Navigator.pages. The pages inside Navigator.pages list are then stacked on top of each other in the UI, once the Navigator rebuilds. If there is more than 1 page, then a pop is available.
BeamerDelegate determines which BeamLocation will handle the URI and then populates the Navigator.pages with the value returned from buildPages.
If we navigate to /books, then BeamerDelegate will check pathPatterns of each BeamLocation and decide that this URI must be handled by BooksBeamLocation. Then it calls its buildPages and the logic therein tells us that the Navigator will be populated with this list/stack of pages:
[
  HomePage,
  BooksPage,
]

and we will be able to pop from books to home.
If we then navigate to /books/2, by similar reasoning, Navigator will be populated with this stack of pages:
[
  HomePage,
  BooksPage,
  BookDetailsPage,
]

Here, we are able to pop from details to books and then pop from books to home.
If we now navigate to /articles, BeamerDelegate will choose ArticlesBeamLocation to provide the pages for Navigator. After this, the Navigator.pages will be:
[
  HomePage,
  ArticlesPage,
]

Note that now we can pop from articles to home and this is the same state of HomePage as it was in the previous stack (with books).
Notice that, if we wanted to be able to pop from articles to book details, as if we pushed the ArticlesScreen onto BookDetailsScreen, we would need to specify this in our BooksBeamLocation.
Or, we can just call the old Navigator.push(ArticlesScreen) if this is a specific case we want to cover like that. This way ArticlesScreen would be pushed onto existing books stack and it could be popped to book details. But, as this scenario is nowhere configured in our BeamLocations nor it is using Beamer at all, nothing would happen with the browser URL. This is perfectly fine for some cases. We could also mitigate this by manually calling Beamer.of(context).updateRouteInformation to update just the browser history. But there is a deeper problem hiding there; this is one-way change and we have no mechanism of restoring the stack of pages from that manually pushed URI.
More specifically; let's say we pushed the ArticlesScreen manually and updated the URL manually to /books/2/articles (or anything). What happens when we sometime in the future type /books/2/articles in the browser URL bar or try to access this entry from browser's history?
We would get notFound, because no BeamLocation handles this URI. Theoretically, it is possible to mitigate this, making Beamer remember these specific manually built stacks and to which URI they belonged. (I'm open to explore on this, as I already have something similar in mind). It is important to understand why things are how they are; this is not a limitation introduced by Beamer.
The bottom line is that BeamLocations have the exact opposite role of being stacked on top of each other; they each represent a "different" stack of pages. The gist of Router API is that we need to specify all possible page stacks that our app can build and to which URI they correspond. This can become very complicated if we have a massive amount of pages that can be anywhere in any stack.
Now a little bit about why are BeamLocations stored in beamingHistory even after they are no longer active. In the previous example, after all beamings, the beamingHistory would look something like this:
[
  BooksBeamLocation(
    history: [
      '/books',
      '/books/2',
    ],
  ),
  ArticlesBeamLocation(
    history: [
      '/articles',
    ],
  )
}

This is used specifically for beaming back (beamBack), i.e. going chronologically back in navigation history, not upward (pop). You can read a bit about 3 types of navigating back here: https://pub.dev/packages/beamer#navigating-back
beamBack serves the same role as does the browser back button - to go directly into the route that was visited before. This is commonly the same as pop, but differs in deep-linking scenarios. The example is the above scenario; beamBack from /articles would lead to /books/2, but pop from /articles would in fact lead to HomeScreen (/).
Android back button is again a special case, it is a combination of pop and beamBack.

Hey @slovnicki thank you very much for your kind and detailed answer. The TLDR is that I basically misunderstood the concept of BeamPages reusage across different BeamLocations. Reusing them as the root page solves all navigation issues I was having with our app.


Updates to the change log for 0.44.0

As title.

Added 982df51 to switch a handle for a name if you'd like to check. Thanks.


Cannot load such file

C:/Ruby23/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in require': cannot load such file -- rautomation (LoadError)         from C:/Ruby23/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in require'
from quickbooks.rb:11:in `'
I have no idea why this is happening. I do a simple gem install, and then require the 'rautomation' gem in my code and it breaks. ._.

Are you using Bundler?

Closing this due to inactivity.