Skip to main content

Gherkin Step Reference

Every step definition shipped with pytest-bdd-ewx, 532 in total, generated from the plugin source. Use the filter to find a step by any word in its text or description, or browse by domain and entity below. Parameters appear as {name}; in a feature file you replace them with a quoted value.

Writing your own steps

If no built-in step fits, see Extending the plugin. The wording in your feature file must match the step text exactly, see Using the plugin.

Data model​

Datasources​

TypeStepWhat it does
Givendatasource "{datasource_id}" has at least one channelChecks if a datasource has at least one channel.
GivenI add the channels from "{file_name}" to that datasource "{datasource_id}"Adds channels from a file to a datasource.
GivenI count the channels of datasource "{datasource_id}"Counts and saves the amount of channels in a datasource.
GivenWhenI create all datasources from "{file_name}"Creates datasources from a given file.
GivenWhenI create all datasources from "{file_name}" if they do not existCreates datasources from a given file.
GivenThenI do not expect a channel classifier "{classifier_name}" to be present for datasource "{datasource_id}"Checks that channel classifier is absent with the given name for the datasource with the given ID.
GivenThenI expect "{increment:d}" new flows with channel classifier "{channel_classifier}" on datasource "{datasource_id}"Checks if amount of new flows with channel classifier is as expected.
GivenThenI expect "{increment:d}" new flows with channel classifier "{channel_classifier}" within "{min_timeout:d}" minutes on datasource "{datasource_id}" with a poll frequency of "{freq:d}" secondsChecks if amount of new flows with channel classifier is as expected.
GivenThenI expect a new flow with config name "{flow_name}" and status "{flow_status}" with channel classifier "{channel_classifier}" on datasource "{datasource_id}"Checks if amount of new successful or failed flows with channel classifier is as expected.
GivenThenI expect a new flow with config name "{flow_name}" and status "{flow_status}" with channel classifier "{channel_classifier}" on datasource "{datasource_id}" within "{timeout:d}" minutes with a poll frequency of "{freq:d}" secondsChecks if amount of new successful or failed flows with channel classifier is as expected.
GivenThenI expect no channels for the datasource with id "{datasource_id}"Checks that a datasource has no channels.
GivenI expect no new flows with channel classifier "{channel_classifier}" on datasource "{datasource_id}"Verify that no new flows with channel classifier are created within the default polling time.
GivenThenif there was ingestion I expect "{increment:d}" new flows with channel classifier "{channel_classifier}" on datasource "{datasource_id}" within "{min_timeout:d}" minutes with a poll frequency of "{freq:d}" secondsConditionally waits for new flows only if ingestion was performed (init_time is set).
Giventhe datasource with ID "{datasource_id}" is not available in datasourcesConfirm that a datasource with the given ID is not available in the datasources list.
GivenWhenThenthere is a datasource with id "{datasource_id}"Check if a datasource with the given ID is created withing the default amount of time.
WhenI add the channels from "{file_name}" to datasource "{datasource_id}"Adds channels from a file to a datasource.
WhenThenI expect "{increment:d}" new flows on datasource "{datasource_id}"Check if a given amount of new flows are created within the default amount of time on a given datasource.
WhenThenI expect "{increment:d}" new flows within "{min_timeout:d}" minutes on datasource "{datasource_id}" with a poll frequency of "{freq:d}" secondsCheck if a given amount of new flows are created within a given amount of time on a given datasource.
WhenThenI expect a new flow with config name "{flow_name}" and status "{flow_status}" on datasource "{datasource_id}"Check if a new flow using a specific flow config was created and has a specific status within the default amount of time on a given datasource.
WhenThenI expect a new flow with config name "{flow_name}" and status "{flow_status}" on datasource "{datasource_id}" to have property "{property_key}" with value "{property_value}"Check that a new flow has the expected value for a specific metadata property.
WhenI expect a new flow with config name "{flow_name}" and status "{flow_status}" on datasource "{datasource_id}" with a poll frequency of "{freq:d}" secondsCheck if a new flow using a specific flow config was created and has a specific status within the default amount of time on a given datasource.
WhenI update all datasources from "{file_name}"Creates datasources from a given file.
ThenI do not expect response to contain "{unexpected_ds_ids}" when I search for datasources with no query and filter by the datasource classifier "{ds_classifier_name}"Verifies that datasources from the list are not returned by search by datasource classifier filter.
ThenI do not expect response to contain "{unexpected_ds_ids}" when I search for datasources with query "{search_filter}"Verifies that datasources from the list are not returned by search with query.
ThenI do not expect response to contain "{unexpected_ds_ids}" when I search for datasources with query "{search_filter}" and filter by the datasource classifier "{ds_classifier_name}"Verifies that datasources from the list are not returned by search with query and datasource classifier.
ThenI expect a channel classifier "{classifier_name}" to be present for datasource "{datasource_id}"Checks that channel classifier is present with the given name for the datasource with the given ID.
ThenI expect a new flow with config name "{flow_name}" and status "{flow_status}" on datasource "{datasource_id}"with a poll frequency of "{freq:d}" secondsCheck if a new flow using a specific flow config was created and has a specific status within the default amount of time on a given datasource.
ThenI expect for datasource with id "{datasource_id}" a channel with channel classifier "{classifier_name}" which is "{source_or_not}"Checks if a channel classifier with the given name was created on a datasource with the given ID.
ThenI expect for datasource with id "{datasource_id}" in channel "{channel_classifier}" property tag "{tag_key}" with value "{tag_value}" and "{amount_versions}"Checks the property tags of a given channel.
ThenI expect for datasource with id "{datasource_id}" in channel "{channel_classifier}" property tag "{tag_key}", "{tag_value}", valid from "{valid_from}", version "{version}" and removed "{removed}"Checks the property tags of a given channel.
ThenI expect in "{channel_classifier}" property tag "{tag_key}" with value "{tag_value}" and "{amount_versions}"Checks the property tags of a given channel.
ThenI expect in "{channel_classifier}" property tag "{tag_key}", "{tag_value}", valid from "{valid_from}", version "{version}" and removed "{removed}"Checks the property tags of a given channel.
ThenI expect latest flow with channel classifier "{channel_classifier}" on datasource "{datasource_id}" with rule "{rule_in_sequence}" to have the parameter "{rule_parameter}" with value "{rule_parameter_value}"Checks if a datasource contains a given flow run rule parameter.
ThenI expect no new flows with channel classifier "{channel_classifier}" within "{min_timeout:d}" minutes on datasource "{datasource_id}" with a poll frequency of "{freq:d}" secondsVerify that no new flows with channel classifier are created within a given amount of time.
ThenI expect response containing "{ds_ids}" when I search for datasources with no filtersSearch for datasources without filters, verifies the required IDs are returned.
ThenI expect response containing "{ds_ids}" when I search for datasources with no query and filter by the datasource classifier "{ds_classifier_name}"Search for datasources, filter by the datasource classifier. Verifies the required IDs are returned.
ThenI expect response containing "{ds_ids}" when I search for datasources with query "{search_filter}"Queries datasources, verifies the required IDs are returned.
ThenI expect response containing "{ds_ids}" when I search for datasources with query "{search_filter}" and filter by the datasource classifier "{ds_classifier_name}"Queries datasources and filters by the datasource classifier. Verifies the required IDs are returned.
ThenI expect response to contain only datasources with id "{expected_ds_ids}" when I search for datasources with query "{query}"Verifies that only expected datasources are returned by search with query.
ThenI expect response to contain only datasources with id "{expected_ds_ids}" when I search for datasources with query "{query}" and filter by the datasource classifier "{ds_classifier_name}"Verifies that only expected datasources are returned by search with query and filter by datasource classifier.
ThenI expect the attribute "{attribute}" contains the value "{value}" for datasource "{datasource_id}"Checks if a datasource has attribute as expected.
ThenI expect the channel "{classifier_name}" of datasource "{datasource_id}" to have the name "{channel_name}"Checks the display name of the channel with the given classifier on the datasource with the given ID.
ThenI expect the following channels on datasource with id "{datasource_id}":Checks multiple channel classifiers and their is_source property on a datasource in a single request.
Thenthe datasource with id "{datasource_id}" includes the channels from "{file_name}"Checks if a datasource has all the channels from a file.
Thenthe number of channels of datasource "{datasource_id}" has changed by "{expected_diff:d}"Checks if the amount of channels in a datasource has changed by the expected value.
Thenthere is a datasource with id "{datasource_id}" within "{timeout:d}" minutes with a poll frequency of "{polling_frequency_in_seconds:d}" secondsCheck if a datasource with the given ID is created withing a given amount of time using a given check interval.

Datasource classifiers​

TypeStepWhat it does
GivenI check the number of datasource classifiers in my namespaceChecks and saves the datasource classifiers currently available in the namespace.
GivenWhenI create all datasource classifiers from "{file_name}"Creates datasource classifiers from a given file.
GivenWhenI create all datasource classifiers from "{file_name}" if they don't existCreates datasource classifiers from a file if they don't already exist.
GivenI upload all datasource classifiers matching the regex pattern "{pattern}" using the default resource managerNo description yet
GivenI upload all datasource classifiers matching the regex pattern "{pattern}" using the resource manager with name "{manager_name}"Uploads all datasource classifiers whose names match the given regex pattern using a specified resource manager.
GivenI upload all datasource classifiers using the default resource managerNo description yet
GivenI upload all datasource classifiers using the resource manager with name "{manager_name}"Uploads all datasource classifiers using a specified resource manager.
GivenI upload the datasource classifier with name "{name}" using the default resource managerNo description yet
GivenI upload the datasource classifier with name "{name}" using the resource manager with name "{manager_name}"Uploads a datasource classifier with given name using a specified resource manager.
WhenI change the "{attribute_key}" of the datasource classifier "{ds_classifier_name}" to "{attribute_value}"Changes the value of a key in a datasource classifier.
ThenI expect the "{attribute_key}" of the datasource classifier "{ds_classifier_name}" to be equal to "{attribute_value}"Checks if the attribute of a datasource classifier equals to the expected value.
Thenthe number of datasource classifiers has increased by "{expected_increase:d}"Check for the increase in the amount of datasource classifiers since the last time.

Channel classifiers and channel families​

TypeStepWhat it does
GivenWhenI add a datapoint attribute if it does not exist with the name "{dpa_name}" of type "{dpa_type}" and editable flag set to "{is_editable}" to the channel "{channel_name}"Adds new DPAs to the channel classifier.
GivenWhenI add an enum datapoint attribute if it does not exist with the name "{dpa_name}" and enum values "{enum_values}" and editable flag set to "{is_editable}" to the channel "{channel_name}"Adds a new enum DPA with its enum values to the channel classifier.
GivenWhenI add datapoint attributes if they do not exist to the channel "{channel_name}" with the following name-type-editable flag:Adds new DPAs to the channel classifier.
GivenI create all channel classifiers from "{file_name}" if they don't existCreates all channel classifiers from a file if they don't exist.
GivenI create all channel families from "{file_name}" if they don't existCreates all channel families from a file if they don't exist.
GivenI upload all channel classifiers matching the regex pattern "{pattern}" using the default resource managerNo description yet
GivenI upload all channel classifiers matching the regex pattern "{pattern}" using the resource manager with name "{manager_name}"Uploads all channel classifiers whose names match the given regex pattern using a specified resource manager.
GivenI upload all channel classifiers using the default resource managerNo description yet
GivenI upload all channel classifiers using the resource manager with name "{manager_name}"Uploads all channel classifiers using a specified resource manager.
GivenI upload the channel classifier with name "{name}" using the default resource managerNo description yet
GivenI upload the channel classifier with name "{name}" using the resource manager with name "{manager_name}"Uploads a channel classifier with given name using a specified resource manager.
GivenThenOn channel classifier with name "{name}" I expect the attribute "{attribute}" with value "{value}"Asserts the value of an attribute from a channel classifier.
WhenI view the list of channel classifiers, I expect the channel "{channel_name}" the datapoint attribute "{dpa_name}" to include enum values "{enum_values}"Checks that the channel classifier has the expected list of enums in the DPA.
WhenI view the list of channel classifiers, I expect the channel "{channel_name}" to have the attribute "{attr_name}" with the value "{attr_value}"Checks that the channel classifier has the expected attribute when browsing the list of channels.
WhenI view the list of channel classifiers, I expect the channel "{channel_name}" to have the datapoint attribute "{dpa_name}" of type "{dpa_type}"Checks that the channel classifier has the expected DPA when browsing the list of channels.
WhenOn channel classifier with name "{name}" I update the attribute "{attribute}" to "{value}"Updates the value of a specific attribute of a channel classifier.
WhenOn channel classifier with name "{name}" I update the datapoint attribute "{datapoint_attribute_name}" with enum values "{enum_values}" if they do not existUpdates the datapoint attribute of a channel classifier with individual enum values.
Thenadding a datapoint attribute with the name "{dpa_name}" of type "{dpa_type}" and editable flag set to "{is_editable}" to the channel "{channel_name}" is rejectedChecks that adding a DPA to the channel classifier is rejected as a bad request.
ThenI check the channel "{channel_name}" has a datapoint attribute with the name "{dpa_name}" of type "{dpa_type}"Checks that the channel classifier has the expected datapoint attributes configured with type.
ThenI check the channel "{channel_name}" has the following datapoint attributes configured with type:Checks that the channel classifier has the expected datapoint attributes configured with type.
ThenI expect this channel classifier "{classifier_name}" to be of data point type "{data_point_type}?"Checks if the data point type of channel classifier is as expected.
ThenI expect this channel classifier "{classifier_name}" to be of unit type "{unit_type}?"Checks if the data unit type of channel classifier is as expected.
ThenOn channel classifier with name "{name}" I expect the datapoint attribute "{datapoint_attribute_name}" to include enum values "{enum_values}"Validates that the datapoint attribute of a channel classifier contains the expected list of enum values.
Thenthe attribute "{attribute}" cannot be updated with blank value for channel classifier "{name}"Attempts to update channel classifier value with blank value.

Tags​

TypeStepWhat it does
GivenWhenI create tags from file "{file_name}"Creates tags from a file on the specified datasource.
GivenWhenThenI expect in tag "{tag_key}" the property "{property_key}" for datasource "{datasource_id}"Periodically checks the presence of a tag with a specific property on a datasource.
GivenWhenThenI expect in tag "{tag_key}" the property "{property_key}" with value "{property_value}" for datasource "{datasource_id}"Periodically checks the presence of a tag with a specific property value on a datasource.
GivenThenI expect no tags for datasource "{datasource_id}"Verifies no tags for the given datasource id.
GivenWhenThenI expect the following tag properties for datasource "{datasource_id}":Periodically checks multiple tag key/property key/property value triples on a datasource in a single request.
GivenWhenI update or create tags from file "{file_name}" for datasource "{datasource_id}"Creates or updates tags from a file on the specified datasource.
WhenI create a tag with the name "{tag_name}" with a property "{property_name}" and a value "{property_value}" for datasource "{datasource_id}"Creates a tag on the specified datasource. Valid from and version are set to 2000-01-01T00:00:00Z.
WhenI create a tag with the name "{tag_name}" with a property "{property_name}" and a value "{property_value}", valid from "{valid_from}" and a version "{version}" for datasource "{datasource_id}"Creates a tag on the specified datasource with specific version and valid from values.
WhenI create a tag with the name "{tag_name}" with a property "{property_name}" with a value "{property_value}" and a version "{version}" for datasource "{datasource_id}"Creates a tag on the specified datasource with specific version. Valid from is set to 2000-01-01T00:00:00Z.
WhenThenI expect in tag "{tag_key}" the property "{property_key}" with value "{property_value}" for datasource "{datasource_id}" within "{time_limit_in_minutes:d}" minutes with a poll frequency of "{polling_frequency_in_seconds:d}" secondsPeriodically checks the presence of a tag with a specific property value on a datasource with a custom polling frequency.
WhenI update tags from file "{file_name}" for datasource "{datasource_id}"Updates tags from a file on the specified datasource.
ThenI expect for datasource with id "{datasource_id}" for the tag "{tag_key}" to have "{n_versions:d}" versionsPeriodically checks the presence of a tag with a specific number of versions on a datasource.
ThenI expect for datasource with id "{datasource_id}" for the tag "{tag_key}" to have "{n_versions:d}" versions after "{wait_duration:d}" secondsWaits for a specified duration, then verifies the tag has the expected number of versions.
ThenI expect for datasource with id "{datasource_id}" the tag "{tag_key}" with property "{property_key}" and the value "{property_value}" to be valid from "{tag_valid_from}"Periodically checks the presence of a tag with a specific valid_from and a specific property on a datasource.
ThenI expect for datasource with id "{datasource_id}" the version "{tag_version}" of the tag "{tag_key}" with property "{property_key}" and the value "{property_value}" to be valid from "{tag_valid_from}" and removed "{removed}"Periodically checks the presence of a tag with a specific version and a specific property value, valid from and removed attributes on a datasource.

Datapoints​

TypeStepWhat it does
WhenI batch edit on datasource "{datasource_id}" the annotation "{annotation_key}" on the channel "{annotation_channel}" to the value "{value}" between "{start}" and "{end}" with edit reason "{edit_reason}"Sets an annotation property on every annotation of a series between two timestamps with the batch endpoint.
WhenI batch multiply on datasource "{datasource_id}" the channel "{channel_classifier}" by "{factor}" between "{start}" and "{end}" with edit reason "{edit_reason}"Multiplies every datapoint of a channel between two timestamps with the batch endpoint.
WhenI edit complex annotation on datasource "{datasource_id}" for channel "{annotation_channel}" at "{timestamp}" with edit reason "{edit_reason}":Edits a complex annotation with multiple key-value pairs for a specified timestamp.
WhenI edit on datasource "{datasource_id}" for channel "{annotation_channel}" at "{timestamp}" the annotation with the name "{annotation_key}" to the value "{value}" with edit reason "{edit_reason}"Edits a single annotation value for a specified timestamp.
WhenI edit on datasource "{datasource_id}" for channel "{channel_classifier}" at "{timestamp}" the datapoint attribute with the name "{dpa_name}" to the value "{value}" with edit reason "{edit_reason}"Edits a single datapoint value for a specified timestamp.
WhenI edit on datasource "{datasource_id}" for channel "{channel_classifier}" at "{timestamp}" the value to "{value}" with edit reason "{edit_reason}"Edits a single datapoint value for a specified timestamp.
WhenI edit on datasource "{datasource_id}" the following annotations with edit reason "{edit_reason}":Edits multiple annotations for a specified datasource using a datatable.
WhenI edit on datasource "{datasource_id}" the following datapoint attributes with edit reason "{edit_reason}":Edits multiple datapoint attributes for a specified datasource using a datatable.
WhenI edit on datasource "{datasource_id}" the following datapoint values with edit reason "{edit_reason}":Edits multiple datapoint values for a specified datasource using a datatable.
WhenI update the datapoints from the file "{file_name}"Updates datapoints from a file, dispatching to V1 or V2 implementation based on the active API version.

Timeseries​

TypeStepWhat it does
ThenI do not expect the flag with the name "{flag_name}" on datasource with id "{datasource_id}" on the channel "{channel_name}" and the datapoint "{timestamp}"Checks that a specific flag is NOT present on a datapoint in a channel.
ThenI expect a datapoint on timestamp "{timestamp}" to have a new version for continuous flow channel "{channel_name}" on datasource with id "{datasource_id}" after datapoint editingChecks that the datapoint version is updated after editing for continuous flow channel.
ThenI expect a datapoint on timestamp "{timestamp}" to have the same version for scenario flow channel "{channel_name}" on datasource with id "{datasource_id}" after datapoint editingChecks that the datapoint version is not updated after editing for a scenario flow channel.
ThenI expect channels with the names "{channel_list}" to have timeseries data between "{start_date}" and "{end_date}" for channel family "{channel_family}" on the datasource with id "{datasource_id}"Verify that each channel from a given list contains timeseries data within a specified date range and channel family filter for the given datasource id.
ThenI expect channels with the names "{channel_list}" to have timeseries data between "{start_date}" and "{end_date}" for channel family "{channel_family}" on the datasource with id "{datasource_id}" when using "{view}" viewVerify that each channel from a given list contains timeseries data within a specified date range and channel family filter for the given datasource id with the requested view.
ThenI expect channels with the names "{channel_list}" to have timeseries data between "{start_date}" and "{end_date}" on the datasource with id "{datasource_id}"Verify that each channel from a given list contains timeseries data within a specified date range for the given datasource id.
ThenI expect channels with the names "{channel_list}" to have timeseries data between "{start_date}" and "{end_date}" on the datasource with id "{datasource_id}" when using "{view}" viewVerify that each channel from a given list contains timeseries data within a specified date range for the given datasource id with the requested view.
ThenI expect in channel "{channel_classifier}" an annotation on index "{timestamp}" for property "{annotation_key}" with value "{annotation_value}" for datasource with ID "{datasource_id}"Checks that an annotation is present at the expected time after processing a datasource.
ThenI expect in datasource with id "{datasource_id}" channel "{channel_classifier}" to have "{amount:d}" values from "{start_date}" for "{years}" yearsValidates a timeseries data point is present in a channel classifier.
ThenI expect in datasource with id "{datasource_id}" for the last flow on the destination channel "{destination_classifier}" in channel "{channel_classifier}" data point "{timestamp}", "{value}"Validates a timeseries data point is present in a channel classifier for the last flow run.
ThenI expect in datasource with id "{datasource_id}" in channel "{channel_classifier}" data point "{timestamp}", "{value}"Validates a timeseries data point is present in a channel classifier.
ThenI expect no annotation for property "{annotation_key}" with value "{annotation_value}" in channel "{channel_classifier}" for the last flow on the destination channel "{destination_classifier}" on index "{timestamp}" for datasource with ID "{datasource_id}"Checks that an annotation is NOT present at the expected timestamp after processing a datasource.
ThenI expect no timeseries data for the datasource with id "{datasource_id}"Checks the datasource has no timeseries data.
ThenI expect on datasource with id "{datasource_id}" channel "{channel_classifier}" to have exactly "{amount:d}" annotations with the name "{annotation_name}" and the property "{annotation_prop_name}" between "{start_date}" and "{end_date}"Validates if exact amount of annotations is present in a channel classifier.
ThenI expect on datasource with id "{datasource_id}" channel "{channel_classifier}" to have exactly "{amount:d}" annotations with the name "{annotation_name}" and the property "{annotation_prop_name}" between "{start_date}" and "{end_date}" when using "{view}" view for version depth "{version_depth:d}"Validates if exact amount of annotations is present in a channel classifier with the requested view and specific version depth.
ThenI expect on datasource with id "{datasource_id}" channel "{channel_classifier}" to have exactly "{amount:d}" datapoint attribute values with the name "{dpa_name}" between "{start_date}" and "{end_date}"Validates if exact amount of specified datapoint attribute is present in a channel classifier.
ThenI expect on datasource with id "{datasource_id}" channel "{channel_classifier}" to have exactly "{amount:d}" datapoint attribute values with the name "{dpa_name}" between "{start_date}" and "{end_date}" when using "{view}" view for version depth "{version_depth:d}"Validates if exact amount of specified datapoint attribute is present in a channel classifier with the requested view and specific version depth.
ThenI expect on datasource with id "{datasource_id}" channel "{channel_classifier}" to have exactly "{amount:d}" flags with the name "{flag_name}" between "{start_date}" and "{end_date}" when using "{view}" view for version depth "{version_depth:d}"Validates if exact amount of specified flag is present in a channel classifier with the requested view and specific version depth.
ThenI expect on datasource with id "{datasource_id}" channel "{channel_classifier}" to have exactly "{amount:d}" values between "{start_date}" and "{end_date}"Validates if exact amount of timeseries data point is present in a channel classifier.
ThenI expect on datasource with id "{datasource_id}" channel "{channel_classifier}" to have exactly "{amount:d}" values between "{start_date}" and "{end_date}" when using "{view}" view for version depth "{version_depth:d}"Validates if exact amount of timeseries data point is present in a channel classifier with the requested view and specific version depth.
ThenI expect on datasource with id "{datasource_id}" for the last flow on the destination channel "{destination_classifier}" in channel "{channel_classifier}" to have exactly "{amount:d}" values between "{start_date}" and "{end_date}"Validates if exact amount of timeseries data point is present in a channel classifier for the last flow run.
ThenI expect on datasource with id "{datasource_id}" to have exactly "{amount:d}" datapoints when using filter "{filter_expression}"Validates the exact amount of datapoints returned by a raw filter query on the timeseries API v2.
ThenI expect on datasource with id "{datasource_id}" to have exactly "{amount:d}" datapoints when using filter "{filter_expression}" with "{view}" view for version depth "{version_depth:d}"Validates the exact amount of datapoints returned by a raw filter query with view and version depth.
ThenI expect the annotation "{annotation_name}" previous value to be equal to "{value}" for the timestamp "{timestamp}" on the channel "{annotation_channel}" in the edits history for the datasource with id "{datasource_id}"[ with edit reason "{edit_reason}" and user email "{user_email}"]Checks that the previous value of an annotation is as expected in the edits history. Optionally, edit reason and user email can be verified in the edits history.
ThenI expect the datapoint attribute "{dpa_name}" previous value to be equal to "{value}" for the timestamp "{timestamp}" on the channel "{channel_name}" in the edits history for the datasource with id "{datasource_id}"[ with edit reason "{edit_reason}" and user email "{user_email}"]Checks that the previous value of a datapoint attribute is as expected in the edits history. Optionally, edit reason and user email can be verified in the edits history.
ThenI expect the datapoint attribute-value pairs "{dpa_name}" and "{dpa_value}" in datasource with id "{datasource_id}" in channel "{channel_classifier}" on timestamp "{timestamp}"Validates data point attribute values in a channel classifier.
ThenI expect the datapoint previous value to be equal to "{value}" for the timestamp "{timestamp}" on the channel "{channel_name}" in the edits history for the datasource with id "{datasource_id}"[ with edit reason "{edit_reason}" and user email "{user_email}"]Checks that the previous value of a datapoint is as expected in the edits history. Optionally, edit reason and user email can be verified in the edits history.
ThenI expect the flag with the name "{flag_name}" on datasource with id "{datasource_id}" on the channel "{channel_name}" and the datapoint "{timestamp}"Checks that a specific flag is present on a datapoint in a channel.
ThenI expect the following annotations for datasource with ID "{datasource_id}" between "{start}" and "{end}":Checks multiple annotations in a single polling loop.
ThenI expect the following datapoint attribute-value pairs in datasource with id "{datasource_id}" in channel "{channel_classifier}" on timestamp "{timestamp}":Validates data point attribute values in a channel classifier.
ThenI expect the following datapoint values on datasource "{datasource_id}" between "{start}" and "{end}":Validates multiple datapoint values across channels in a single API call.
ThenI expect the following datapoint values on datasource "{datasource_id}" for the last flow on the destination channel "{destination_classifier}" between "{start}" and "{end}":Validates multiple datapoint values across channels for the last flow in a single API call.
ThenI expect the latest value on datasource "{datasource_id}" for channel "{channel_classifier}" to match:Validates the latest value for a datasource and channel using the getLatestValue API v2 endpoint.
ThenI verify the timeseries datapoint version of channel "{channel_classifier}" in ds id "{datasource_id}" with timestamp "{timestamp}" got updated with new datapoint version value after ingestionVerify DP version value got updated after ingestion.

Virtual datasources​

TypeStepWhat it does
GivenI clear the flow reference from virtual datasource "{virtual_datasource_name}"Clears the flowReferenceId on a virtual datasource by sending an empty string.
GivenI create a virtual datasource with name "{virtual_datasource_name}" using the filter "{virtual_datasource_filter}"Creates a virtual datasource.
GivenI create a virtual datasource with name "{virtual_datasource_name}" using the filter "{virtual_datasource_filter}" and channel classifier "{virtual_datasource_classifier}"Creates a virtual datasource.
GivenI create a virtual datasource with name "{virtual_datasource_name}" using the filter "{virtual_datasource_filter}" with channels "{channel_classifiers_str}" and flow reference "{flow_reference_name}" and triggerNowCreates a virtual datasource with a flow reference ID and triggerNow=True.
GivenWhenI create all virtual datasources from "{virtual_datasource_file_name}"Creates virtual datasources from json file.
GivenI trigger the virtual datasource "{virtual_datasource_name}"Triggers a virtual datasource without chained flow but with start and end date range.
GivenI trigger the virtual datasource "{virtual_datasource_name}" with the chained flow design "{flow_design_name}" between "{trigger_start_date}" and "{trigger_end_date}"Triggers a virtual datasource with a flow design.
GivenI trigger the virtual datasource "{virtual_datasource_name}"$between "{trigger_start_date}" and "{trigger_end_date}"Triggers a virtual datasource without chained flow but with start and end date range.
GivenI update the virtual datasource "{virtual_datasource_name}" attribute "{attr_name}" to "{attr_value}"Updates a virtual datasource .
GivenI update the virtual datasource "{virtual_datasource_name}" with flow reference "{flow_reference_name}"Updates a virtual datasource's flowReferenceId, resolving the flow name to an ID.

Ingestion​

Files and ingestion​

TypeStepWhat it does
GivenI check the number of files in my namespaceChecks the number of files in the namespace.
GivenI delete the file "{file_name}" if existsDeletes file if exists.
GivenWhenThenI expect the file "{file_name}" in file managerVerifies that a file is in storage within default time limit.
GivenThenI expect the file "{file_name}" to have an attribute "{attr_key}" with value "{attr_value}"Validates the file's attribute value by file name.
GivenWhenThenI expect the file with the name "{file_name}" in file manager with content matching the file "{test_data_file_name}"No description yet
GivenWhenThenI expect the file with the name containing "{file_name_part}" in file manager within "{time_limit_in_minutes:d}" minutes with a poll frequency of "{polling_freq_in_seconds:d}" secondsVerifies that a file is in storage within a given time limit, by partial file name search.
GivenWhenThenI expect the file with the name containing "{file_name_part}" to be absent from file manager within "{time_limit_in_minutes:d}" minutes with a poll frequency of "{polling_freq_in_seconds:d}" secondsVerifies a file never appears in file manager within a time limit (partial name match).
GivenWhenThenI expect the file with the name containing "{file_name}" in file managerVerifies that a file is in storage by partial name search within default time limit.
GivenThenI expect the file with the name containing "{file_name}" to have an attribute "{attr_key}" with value "{attr_value}"Validates the file's attribute value using partial file name search.
GivenWhenI ingest the file "{file_name}"Ingests a file without specifying a market adapter.
GivenWhenI ingest the file "{file_name}" with market adapter "{adapter_name}"Ingests a file using a given market adapter to do so.
GivenI upload the file "{file_name}" with market adapter "{adapter_name}" assigned and tags "{tag_names}" addedUploads a file to file management with assigned market adapter, and adds the given tags to it.
GivenWhenI upload the file "{file_path}"Uploads files to file management.
GivenI upload the file "{file_path}" as "{new_file_name}" where the value for "{key}" is "{value}"Uploads a file to the file management with the specified name, and saves the specified value with the key in the context to share among steps.
GivenI upload the file "{file_path}" where the value for "{key}" is "{value}"Uploads a file to the file management and saves the specified value with the key in the context to share among steps.
GivenI upload the file "{file_path}" with market adapter "{adapter_name}" assignedUploads a file to file management with assigned market adapter.
Giventhere is no datasource with id "{datasource_id}" I upload and ingest the file "{file_path}" with market adapter "{market_adapter_name}"Conditional ingestion if a given datasource does not exist. This is helpful for scenarios where the setup might be expensive. For example when the test depends on the existence of a datasource with particularly big sizes.
WhenI add the tags "{tags}" to the file "{file_name}"Adds tags to the specified file.
WhenI add the tags "{tags}" to the file with the name "{partial_file_name}"Adds tags to the specified file.
WhenI add the tags "{tags}" to the file with the name containing "{partial_file_name}"Adds tags to the file by partial file name (allowing prefix).
WhenI assign market adapter with the name "{adapter_name}" to the file "{file_name}"Assigns a market adapter to the specified file.
WhenI delete tag "{tag_name}" from the file "{file_name}"Deletes the given tag from the specified file.
WhenI delete the file "{file_name}"Deletes the specified file.
ThenI expect "{file_name}" in file manager within "{time_limit_in_minutes:d}" minutes with a poll frequency of "{polling_freq_in_seconds:d}" secondsVerifies that a file is in storage within a given time limit.
ThenI expect the file with the name "{file_name}" in file manager with content matching the file "{test_data_file_name}" after processed by script in "{script_path}"No description yet
ThenI expect the file with the partial name "{file_name}" in file manager with content matching the file "{test_data_file_name}" after processed by script in "{script_path}"No description yet
ThenI should see the details of the file "{file_name}"Checks the details of the specified file.
ThenI should see the tags "{tags}" in the file "{file_name}"Validates if the given tags are present in the specified file.
ThenI should see the tags "{tags}" in the file with the name "{file_name}"Validates if the given tags are present in the specified file.
ThenI should see the tags "{tags}" in the file with the name containing "{partial_file_name}"Validates if the given tags are present in the file searched by partial name (allowing prefix).
Thenthe file "{file_name}" should be linked to market adapter with the name "{adapter_name}"Validates the specified file is linked to the given market adapter.
Thenthe file "{file_name}" should be linked to the market adapter with the name "{ma_name}"Validates if the file is linked to the given market adapter by file name.
Thenthe file with the name containing "{file_name}" should be linked to the market adapter with the name "{ma_name}"Validates if the file is linked to the given market adapter by partial file name search.
Thenthe number of files has decreased by "{expected_decrease:d}"Validates the number of files has decreased to an expected value within a given time limit.
Thenthe number of files has decreased by "{expected_decrease:d}" within "{time_limit_in_minutes:d}" minutes with a poll frequency of "{polling_freq_in_seconds:d}" secondsChecks if the number of files has decreased by a certain amount within a given time limit.
Thenthe number of files has increased by "{expected_increase:d}"Validates the number of files has increased to an expected value within a given time limit.
Thenthe number of files has increased by "{expected_increase:d}" within "{time_limit_in_minutes:d}" minutes with a poll frequency of "{polling_freq_in_seconds:d}" secondsChecks if the number of files has increased by a certain amount within a given time limit.
ThenThe tag "{tag_name}" is not present in the file "{file_name}"Validates that the given tag is not present in the specified file.
Thenthere is/are "{expected_amount:d}" file(s) created after ingestionVerifies that the number of files created after ingestion is as expected.

Market adapters​

TypeStepWhat it does
GivenI check the number of market adapters in my namespaceChecks the number of market adapters in the namespace.
GivenI create a configured market adapter from "{file_name}"Creates a market adapter from a file and replaces its Transformation Configuration names with IDs.
GivenI create a market adapter from "{file_name}" with configuration "{conf_name}"Creates a market adapter from a file and a given transformation configuration.
GivenI create a market adapter from "{file_name}" with transformation configuration "{conf_name}"Creates a market adapter from a file and a given transformation configuration.
GivenWhenI create all market adapters from "{file_name}"Creates market adapters from a given file.
GivenI upload all market adapters matching the regex pattern "{pattern}" using the default resource managerNo description yet
GivenI upload all market adapters matching the regex pattern "{pattern}" using the resource manager with name "{manager_name}"Uploads all market adapters whose names match the given regex pattern using a specified resource manager.
GivenI upload all market adapters using the default resource managerNo description yet
GivenI upload all market adapters using the resource manager with name "{manager_name}"Uploads all market adapters using a specified resource manager.
GivenI upload the market adapter with name "{name}" using the default resource managerNo description yet
GivenI upload the market adapter with name "{name}" using the resource manager with name "{manager_name}"Uploads a market adapter with given name using a specified resource manager.
ThenI have no market adapters anymoreChecks that there are no more market adapters.
ThenI should be able to see the names of all market adaptersValidates whether all marker adapters in the active namespace have names.
ThenI should see the versions of the market adapter with the name "{name}"Validates that the versions of the market adapter with the given name can be retrieved.
Thenthe "{key}" of the market adapter with the name "{name}" should be "{value}"Validates the value of a specific field of the market adapter with the given name.
Thenthe number of market adapters has decreased by "{expected_decrease:d}"Validates that the number of market adapters has decreased by the expected amount.
Thenthe number of market adapters has increased by "{expected_increase:d}"Validates that the number of market adapters has increased by the expected amount.

Market adapter implementations​

TypeStepWhat it does
GivenI create a market adapter implementation from "{file_name}"Creates a market adapter implementation from a JSON file in the test-data directory.
WhenI create a market adapter from "{file_name}" linked to implementation with technical name "{impl_tech_name}"Creates a market adapter from a JSON file and links it to an existing implementation.
WhenI delete the market adapter implementation with technical name "{name}"Deletes the market adapter implementation with the given technical name.
WhenI update the market adapter implementation with technical name "{name}" from "{file_name}"Updates a market adapter implementation by technical name using data from a JSON file.
Thenthe market adapter implementation with technical name "{name}" does not existChecks that a market adapter implementation with the given technical name does not exist.
Thenthe market adapter implementation with technical name "{name}" existsChecks that a market adapter implementation with the given technical name exists.
Thenthe market adapter implementation with technical name "{name}" has the attribute "{attr_name}" with value "{attr_value}"Checks that a market adapter implementation has the expected value for a given attribute.
Thenthe market adapter with the name "{ma_name}" has an implementation with technical name "{impl_tech_name}"Checks that a market adapter is linked to the expected implementation.

Transformation configurations​

TypeStepWhat it does
GivenI check the number of transformation configurations in my namespaceFetches the transformation configurations in the namespace and places them in the tests context dictionary.
GivenI create a transformation configuration from "{file_name}" with flow design "{flow_design_name}"Creates a transformation configuration with a flow design from a file.
GivenI create all transformation configurations from "{file_name}"Creates a transformation configuration from a file.
GivenI expect in transformation configuration with name "{tc_name}" the flow properties to contain the key "{prop_key}" with the value "{prop_value}"Validates the flow property key-value of the given transformation configuration.
GivenI upload all transformation configurations matching the regex pattern "{pattern}" using the default resource managerNo description yet
GivenI upload all transformation configurations matching the regex pattern "{pattern}" using the resource manager with name "{manager_name}"Uploads all transformation configurations whose names match the given regex pattern using a specified resource manager.
GivenI upload all transformation configurations using the default resource managerNo description yet
GivenI upload all transformation configurations using the resource manager with name "{manager_name}"Uploads all transformation configurations using a specified resource manager.
GivenI upload the transformation configuration with name "{name}" using the default resource managerNo description yet
GivenI upload the transformation configuration with name "{name}" using the resource manager with name "{manager_name}"Uploads a transformation configuration with given name using a specified resource manager.
ThenI have no transformation configurations anymoreChecks that there are no transformation configurations.
ThenI should be able to see the names of all transformation configurationsValidates whether all transformation configurations in the active namespace have a name.
ThenI should see the versions of the transformation configuration with the name "{name}"Validates whether the versions of the transformation configuration with the given name can be fetched.
Thenthe number of transformation configurations has decreased by "{expected_decrease:d}"Validates that the number of transformation configurations has decreased by an expected amount.
Thenthe number of transformation configurations has increased by "{expected_increase:d}"Validates that the number of transformation configurations has increased by an expected amount.

SOAP endpoints​

TypeStepWhat it does
GivenThenI consume the soap endpoint with name "{soap_endpoint_name}" with the file "{file_name}"Consumes a SOAP endpoint using a given file.
GivenI create all soap endpoints from "{soap_endpoints_file_name}"Creates SOAP endpoints from a file.
GivenWhenI delete the soap endpoint with name "{soap_endpoint_name}"Delete SOAP endpoint.
GivenI expect to receive an error "{error_text}" on consuming SOAP endpoint with name "{soap_endpoint_name}" from template file "{file_name}"Consumes a SOAP endpoint using a given file and verify the error for incorrect XML content.
GivenI update the attribute "{attribute}" with value "{value}" for soap endpoint name "{soap_endpoint_name}"Updates a SOAP endpoint attributes.
GivenI upload all SOAP endpoints matching the regex pattern "{pattern}" using the default resource managerNo description yet
GivenI upload all SOAP endpoints matching the regex pattern "{pattern}" using the resource manager with name "{manager_name}"Uploads all SOAP endpoints whose names match the given regex pattern using a specified resource manager.
GivenI upload all SOAP endpoints using the default resource managerNo description yet
GivenI upload all SOAP endpoints using the resource manager with name "{manager_name}"Uploads all SOAP endpoints using a specified resource manager.
GivenI upload the SOAP endpoint with name "{name}" using the default resource managerNo description yet
GivenI upload the SOAP endpoint with name "{name}" using the resource manager with name "{manager_name}"Uploads a SOAP endpoint with given name using a specified resource manager.
GivenThenthere is/are "{expected_count:d}" SOAP endpoint(s) createdRetrieves all SOAP endpoints.
ThenI expect "{expected_count:d}" SOAP response file(s) with operation "{soap_operation_name}"Find the SOAP message response file.
ThenI expect the attribute "{attribute}" contains the value "{expected_value}" for soap endpoint name "{soap_endpoint_name}"Retrieves a SOAP details based on the name and check the attributes.

Inbound REST integration service​

TypeStepWhat it does
WhenI send the EREX aggregated measurement series message "{file_name}" to the inrest serviceSends an EREX aggregated measurement series payload to the inrest service.
Thenthe accepted EREX message is stored in the file manager within "{timeout:d}" secondsPolls the file manager for the file the inrest service creates for an accepted message.
Thenthe inrest service accepts the messageAsserts the inrest response is a 200 referencing the sent message id.

Integrations stub (external systems)​

TypeStepWhat it does
Giventhe integrations stub has no recorded messagesClears the stub's queued and sent message state.
Giventhe integrations stub is reachableAsserts the deployed integrations stub answers its health endpoint.
WhenI queue an inbound "{message_type}" message with content type "{content_type}" on the integrations stubQueues an inbound message on the stub for the soap-hub scheduler's next poll.
Whenthe integrations stub http-pull document is updatedPublishes a new revision of the stubbed http_pull document.
Thenthe integrations stub receives a sent message containing "{text}" within "{timeout:d}" secondsPolls the stub until a message whose SOAP XML contains the given text was sent to it.
Thenthe integrations stub receives an acknowledgement for the queued message within "{timeout:d}" secondsPolls the stub for an acknowledgement referencing the queued message.
Thenthe stubbed document source receives a conditional http-pull request within "{timeout:d}" secondsPolls the stub's document source until a conditional GET was recorded.
Thenthe stubbed SEL meter is polled within "{timeout:d}" secondsPolls the stub's SEL meter counters until the modbus service has connected and read registers.
Thenthe stubbed target API receives a request for path "{path}" within "{timeout:d}" secondsPolls the stub's ribs target facade until a request for the given path was recorded.

Pub/Sub​

TypeStepWhat it does
GivenI create the pubsub subscriber to subscription "{name}"Creates a pubsub subscription.
ThenI pull 1 message from the pubsub subscription "{name}" and compare it with the content in file "{file_path}"Pulls 1 message from pubsub subscription and compares the content with the payload of a given file.
ThenI pull 1 message from the pubsub subscription "{name}" and compare it with the content in file "{file_path}" after processed by script in "{script_path}"Pulls 1 message from pubsub subscription and compares the content with the payload of a given file. The content of the file and the output of pubsub is processed by a script before comparison.
ThenI pull 1 message from the pubsub subscription "{name}" and compare it with the content in file "{file_path}" and correlation_id "{correlation_id}"Pulls 1 message from a pubsub subscription and compares both its data payload and its ``correlationId`` attribute with the expected values.

Processing and business logic​

Flow designs​

TypeStepWhat it does
GivenI check the number of flow designs in my namespaceFetches the flow designs from the active namespace and stores them on the context.
GivenI create all flow designs from "{flow_designs_file_name}"Creates flow designs from a file.
GivenI create all flow designs from "{flow_designs_file_name}" and decision trees from "{decision_trees_file_name}"Creates flow designs and decision trees from a file.
GivenWhenThenI create the delta variable "{variable_name}" with a timeout of "{timeout_in_seconds:d}" seconds from nowNo description yet
GivenWhenI trigger the flow design "{flow_design_name}" for the datasource "{datasource_id}" with the channel classifier "{channel_classifier}" between "{start_date}" and "{end_date}"Triggers a flow for a Datasource.
GivenWhenThenI update in the flow design "{flow_to_update}" the sequence name "{seq_to_update}" the rule function "{rule_function_name}" with parameter key "{param_key_to_update}" the new value "{value_to_update}"Update flow - seq - rule parameter.
GivenI upload all flows matching the regex pattern "{pattern}" using the default resource managerNo description yet
GivenI upload all flows matching the regex pattern "{pattern}" using the resource manager with name "{manager_name}"Uploads all flows whose names match the given regex pattern using a specified resource manager.
GivenI upload all flows using the default resource managerNo description yet
GivenI upload all flows using the resource manager with name "{manager_name}"Uploads all flows using a specified resource manager.
GivenI upload the flow with name "{name}" using the default resource managerNo description yet
GivenI upload the flow with name "{name}" using the resource manager with name "{manager_name}"Uploads a flow with given name using a specified resource manager.
WhenI trigger the datasource flow design "{flow_design_name}" for the datasource "{datasource_id}"Triggers a flow for a Datasource.
WhenI trigger the datasource flow design "{flow_design_name}" for the datasource "{datasource_id}" between "{start_date}" and "{end_date}"Triggers a flow for a Datasource.
ThenI have no flow designs anymoreValidates that there are no flow designs.
ThenI should be able to see the names of all flow designsValidates that all flow designs in the active namespace have names.
ThenI should see the versions of the flow design with the name "{flow_name}"Validates that the versions of the flow design with the given name can be retrieved.
Thenthe number of flow designs has decreased by "{expected_decrease:d}"Validates that the number of flow designs has decreased by the expected amount.
Thenthe number of flow designs has increased by "{expected_increase:d}"Validates that the number of flow designs has increased by the expected amount.

Rules​

TypeStepWhat it does
GivenI check the number of rules of rule type "{rule_type_name}" in my namespaceFetches the rules of a specific type from the namespace and stores them in the tests context dictionary.
GivenI create all rules from "{file_name}"Creates all rules present in a given file.
GivenI upload all rules matching the regex pattern "{pattern}" using the default resource managerNo description yet
GivenI upload all rules matching the regex pattern "{pattern}" using the resource manager with name "{manager_name}"Uploads all rules whose names match the given regex pattern using a specified resource manager.
GivenI upload all rules using the default resource managerNo description yet
GivenI upload all rules using the resource manager with name "{manager_name}"Uploads all rules using a specified resource manager.
GivenI upload all transform rules matching the regex pattern "{pattern}" using the default resource managerNo description yet
GivenI upload all transform rules matching the regex pattern "{pattern}" using the resource manager with name "{manager_name}"Uploads all transform rules whose names match the given regex pattern using a specified resource manager.
GivenI upload all transform rules using the default resource managerNo description yet
GivenI upload all transform rules using the resource manager with name "{manager_name}"Uploads all transform rules using a specified resource manager.
GivenI upload the rule with name "{name}" using the default resource managerNo description yet
GivenI upload the rule with name "{name}" using the resource manager with name "{manager_name}"Uploads a rule with given name using a specified resource manager.
GivenI upload the transform rule with name "{name}" using the default resource managerNo description yet
GivenI upload the transform rule with name "{name}" using the resource manager with name "{manager_name}"Uploads a transform rule with given name using a specified resource manager.
WhenI change the "{key}" of the rule with the name "{name}" to "{value}"Updates the value of a given key of the rule with the given name.
WhenI create a rule from "{file_name}"Creates a rule from a given file.
WhenI delete the rule with the name "{name}"Deletes the rule with the given name.
ThenI should be able to see the content of the rule typesValidates that all the rule types in the namespace have contents.
ThenI should be able to see the names of all rules of type "{rule_type_name}"Validates that all the rules in the namespace have a name.
ThenI should see the versions of the rule with the name "{name}"Validates that the versions of the rule with the given name can be fetched.
Thenthe "{key}" of the rule with the name "{name}" should be "{value}"Validates the value of a specific field of the rule with the given name.
Thenthe number of rules is "{amount:d}"Checks the number of rules created.
Thenthe number of rules of rule type "{rule_type_name}" has decreased by "{expected_decrease:d}"Validates that the number of rules of a given type has decreased by an expected amount.
Thenthe number of rules of rule type "{rule_type_name}" has increased by "{expected_increase:d}"Validates that the number of rules of a given type has increased by an expected amount.
Thenthe rule with the name "{name}" existsValidates that a rule with the given name exists in the namespace.

Triggers and trigger schedules​

TypeStepWhat it does
GivenThenAvailable triggers technical names are: {names}Gets a list of available triggers.
GivenI create a Big Query ingest trigger from file "{file_name}" with the market adapter "{ma_name}"Create a trigger for the BQ ingest service.
GivenI create a flow trigger from file "{file_name}" with the flow "{flow_name}"Create a trigger for the flow service.
GivenWhenI create a trigger from file "{file_name}"Create a trigger.
GivenI create a vds trigger from file "{file_name}" with "{flow_name}" chained flowCreate a trigger for the VDS service with chained flow.
GivenWhenThenI update the trigger with the name "{trigger_name}" the attribute "{attribute}" to "{value}"Updates an attribute of a trigger
GivenI upload all trigger schedules matching the regex pattern "{pattern}" using the default resource managerNo description yet
GivenI upload all trigger schedules matching the regex pattern "{pattern}" using the resource manager with name "{manager_name}"Uploads all trigger schedules whose names match the given regex pattern using a specified resource manager.
GivenI upload all trigger schedules using the default resource managerNo description yet
GivenI upload all trigger schedules using the resource manager with name "{manager_name}"Uploads all trigger schedules using a specified resource manager.
GivenI upload the trigger schedule with name "{name}" using the default resource managerNo description yet
GivenI upload the trigger schedule with name "{name}" using the resource manager with name "{manager_name}"Uploads a trigger schedule with given name using a specified resource manager.
WhenI execute the trigger with the name "{trigger_name}"Execute a trigger manually.
ThenI check created time of the file "{file_name}" after the trigger is executedCheck that file's creation time is according to trigger schedule (by file name).
ThenI check created time of the file with the name containing "{file_name}" after the trigger is executedCheck that file's creation time is according to trigger schedule (using partial file name search).
ThenI check the flow timestamp on channel classifier "{channel_classifier}" on datasource "{datasource_id}" after the trigger is executedChecks that the flow timestamp is according to trigger execution time.

Decision trees​

TypeStepWhat it does
GivenI create all decision trees from "{file_name}"Creates decision trees from a given file.
GivenI set the default decision tree in the current namespace to "{decision_tree_name}"Sets the default decision tree in the current namespace to the given name.
GivenI upload all flow decision trees matching the regex pattern "{pattern}" using the default resource managerNo description yet
GivenI upload all flow decision trees matching the regex pattern "{pattern}" using the resource manager with name "{manager_name}"Uploads all flow decision trees whose names match the given regex pattern using a specified resource manager.
GivenI upload all flow decision trees using the default resource managerNo description yet
GivenI upload all flow decision trees using the resource manager with name "{manager_name}"Uploads all flow decision trees using a specified resource manager.
GivenI upload all rule decision trees matching the regex pattern "{pattern}" using the default resource managerNo description yet
GivenI upload all rule decision trees matching the regex pattern "{pattern}" using the resource manager with name "{manager_name}"Uploads all rule decision trees whose names match the given regex pattern using a specified resource manager.
GivenI upload all rule decision trees using the default resource managerNo description yet
GivenI upload all rule decision trees using the resource manager with name "{manager_name}"Uploads all rule decision trees using a specified resource manager.
GivenI upload the flow decision tree with name "{name}" using the default resource managerNo description yet
GivenI upload the flow decision tree with name "{name}" using the resource manager with name "{manager_name}"Uploads a flow decision tree with given name using a specified resource manager.
GivenI upload the rule decision tree with name "{name}" using the default resource managerNo description yet
GivenI upload the rule decision tree with name "{name}" using the resource manager with name "{manager_name}"Uploads a rule decision tree with given name using a specified resource manager.

Timeslice groups​

TypeStepWhat it does
GivenWhenI create all timeslice groups from "{file_name}"Creates timeslice groups from a given file.
GivenI upload all timeslice groups matching the regex pattern "{pattern}" using the default resource managerNo description yet
GivenI upload all timeslice groups matching the regex pattern "{pattern}" using the resource manager with name "{manager_name}"Uploads all timeslice groups whose names match the given regex pattern using a specified resource manager.
GivenI upload all timeslice groups using the default resource managerNo description yet
GivenI upload all timeslice groups using the resource manager with name "{manager_name}"Uploads all timeslice groups using a specified resource manager.
GivenI upload the timeslice group with name "{name}" using the default resource managerNo description yet
GivenI upload the timeslice group with name "{name}" using the resource manager with name "{manager_name}"Uploads a timeslice group with given name using a specified resource manager.
GivenThenThe attribute with name "{attribute}" of timeslice group "{group_name}" is set to "{value}"Validates that the attribute of a timeslice group is present and has the expected value.
GivenThenThe number of timeslice groups is "{amount:d}"Validates the number of timeslice groups is as expected.
GivenThenThe timeslice group with name "{group_name}" has "{amount:d}" historical versionsValidates that the number of historical versions of a timeslice group is as expected.
GivenThe timeslice group with name "{group_name}" has "{amount:d}" versionsValidates that the number of versions of a timeslice group is as expected.
WhenI set the "{attribute}" of the timeslice group with name "{group_name}" to "{value}"Updates a attribute on a given timeslice group.
ThenThe timeslice group with name "{group_name}" has "{amount:d}" old versionsValidates that the number of versions of a timeslice group is as expected.

ML models​

TypeStepWhat it does
GivenI create an ML model with name "{model_name}", runtime "{runtime}" and file "{file_name}"Creates a new ML Model.
GivenI update an ML model with name "{model_name}", runtime "{runtime}" and file to "{file_name}"Updates the ML Model with the model_name.
GivenThere is an ML model with the name "{model_name}"Checks if an ML Model exist.
WhenI delete the ML model with the name "{model_name}"Deletes an ML Model.
WhenI deploy the ML model with the name "{model_name}"Deploys an ML Model.
WhenI disable the ML model with the name "{model_name}"Disables an ML Model.
ThenI expect an ML model with the name "{model_name}", runtime "{runtime}", file "{file_name}" and active status "{active}"Checks if an ML Model has all these values in its attributes.
ThenI expect there is no ML model with the name "{model_name}"Checks if an ML Model does not exist.

Computed flags​

TypeStepWhat it does
GivenI create all flags from "{file_name}"Creates all flags present in a given file.
ThenI expect the flag with the name "{name}" to have the attribute "{attr}" with the value "{value}"Checks if the value of an attribute in the flag.

Tasks, task boards, statuses and types​

TypeStepWhat it does
GivenI create a task status with name "{name}"Creates a new task status with the given name.
GivenI create a task status with name "{name}", if it doesn't existCreates a new task status with the given name, if it doesn't exist.
GivenI create a task type with name "{name}"Creates a new task type with the given name, if it doesn't exist.
GivenI create all task boards from "{file_name}"Creates task boards from a given file.
GivenI save the number of tasks on the current namespaceSave the number of tasks.
GivenI upload all task statuses matching the regex pattern '{pattern}' using the default resource managerNo description yet
GivenI upload all task statuses matching the regex pattern '{pattern}' using the resource manager with name '{manager_name}'Uploads all task statuses whose names match the given regex pattern using a specified resource manager.
GivenI upload all task statuses using the default resource managerNo description yet
GivenI upload all task statuses using the resource manager with name '{manager_name}'Uploads all task statuses using a specified resource manager.
GivenI upload all task types matching the regex pattern '{pattern}' using the default resource managerNo description yet
GivenI upload all task types matching the regex pattern '{pattern}' using the resource manager with name '{manager_name}'Uploads all task types whose names match the given regex pattern using a specified resource manager.
GivenI upload all task types using the default resource managerNo description yet
GivenI upload all task types using the resource manager with name '{manager_name}'Uploads all task types using a specified resource manager.
GivenI upload all taskboards matching the regex pattern '{pattern}' using the default resource managerNo description yet
GivenI upload all taskboards matching the regex pattern '{pattern}' using the resource manager with name '{manager_name}'Uploads all taskboards whose names match the given regex pattern using a specified resource manager.
GivenI upload all taskboards using the default resource managerNo description yet
GivenI upload all taskboards using the resource manager with name '{manager_name}'Uploads all taskboards using a specified resource manager.
GivenI upload the task status with name '{name}' using the default resource managerNo description yet
GivenI upload the task status with name '{name}' using the resource manager with name '{manager_name}'Uploads a task status with given name using a specified resource manager.
GivenI upload the task type with name '{name}' using the default resource managerNo description yet
GivenI upload the task type with name '{name}' using the resource manager with name '{manager_name}'Uploads a task type with given name using a specified resource manager.
GivenI upload the taskboard with name '{name}' using the default resource managerNo description yet
GivenI upload the taskboard with name '{name}' using the resource manager with name '{manager_name}'Uploads a taskboard with given name using a specified resource manager.
Giventhe number of tasks is "{amount:d}"Check the number of tasks.
WhenThenI expect "{amount:d}" task(s) with the title "{title}" within "{time_limit_in_minutes:d}" minutes with a poll frequency of "{polling_frequency_in_seconds:d}" secondsPoll to check if the expected amount of tasks with given title exist.
WhenThenthe task with the title "{title}" exists within "{time_limit_in_minutes:d}" minutes with a poll frequency of "{polling_frequency_in_seconds:d}" secondsPoll to check if the task with given title exists.
ThenI expect the number of tasks to be "{amount:d}"Check the number of tasks.
ThenI expect the task with the title "{task_title}" on the task board with the name "{task_board_name}"Check if the task is on the task board.
ThenI expect the task with the title "{task_title}" on the task board with the name "{task_board_name}" under status "{task_status}"Check if the task is on the task board under appropriate status.
ThenI expect there to be "{amount:d}" more tasks within "{time_limit_in_minutes:d}" minutes with a poll frequency of "{polling_frequency_in_seconds:d}" secondsCheck if the number of tasks has increased by a certain amount.
Thenthe task with the title "{task_title}" has the attribute "{attribute_name}" with the value "{attribute_value}"Check some of the tasks attributes value.
Thenthe task with the title "{task_title}" has the following attributes:Verify multiple task attributes in a single API call.
Thenthe task with the title "{task_title}" has the subject attribute "{attribute_name}" with the value "{attribute_value}"Check the attribute value "subject" of the task.
Thenthe task with the title "{task_title}" is linked to the task board with the name "{task_board_names}"Check if the task is linked to the task board.

Administration​

Namespaces​

TypeStepWhat it does
GivenWhenI bootstrap the current namespaceBootstraps the current namespace.
GivenWhenI bootstrap the namespace with id "{namespace_id}"Bootstraps the namespace which was created by the `Given I create a namespace from "generic_customer.json"` step.
GivenI set the "{property_name}" in the current namespace to "{property_value}"Sets a property in the current namespace.
GivenI upload all namespace properties matching the regex pattern "{pattern}" using the default resource managerNo description yet
GivenI upload all namespace properties matching the regex pattern "{pattern}" using the resource manager with name "{manager_name}"Uploads all namespace properties whose names match the given regex pattern using a specified resource manager.
GivenI upload all namespace properties using the default resource managerNo description yet
GivenI upload all namespace properties using the resource manager with name "{manager_name}"Uploads all namespace properties using a specified resource manager.
GivenI upload the namespace property with name "{name}" using the default resource managerNo description yet
GivenI upload the namespace property with name "{name}" using the resource manager with name "{manager_name}"Uploads a namespace property with given name using a specified resource manager.
ThenI expect the current namespace to be bootstrappedMakes sure that all needed resources have been instantiated in Datastore, BigTable and BigQuery.

Billing account​

TypeStepWhat it does
GivenI add the property with the key "{prop_key}" with the value "{prop_value}" to the current billing accountAdds a property key-value to the current billing account.
GivenI create a namespace with the name "{namespace_name}" in the billing account with id "{billing_account_id}"Creates a namespace to be used by the test.
GivenThenI do not expect the current billing account to contain the property key '{prop_key}' with the value '{prop_value}'Checks that a property key-value of the current billing account does not exist.
GivenI expect the current billing account to contain the property key "{prop_key}" with the value "{prop_value}"Checks a property key-value of the current billing account.
GivenThenI remove the property with the key "{prop_key}" with the value "{prop_value}" from the current billing accountRemoves a property key-value from the current billing account.

Identity and test users​

TypeStepWhat it does
GivenWhenI act as the environment identityPuts the environment's own identity back in charge.
GivenWhenI act as the test user "{email}"Makes the provisioned user the acting identity for the rest of the scenario.
GivenI provision the test user "{email}" with the groups "{group_ids}" on the namespace "{namespace_id}"Grants a user the given groups on a namespace and mints credentials that act as them.
GivenI provision the test user "{email}" without any grantMints credentials that act as a user who holds no grant anywhere.
WhenI refresh the token of the test user "{email}"Drops the cached token of a provisioned user so the next request mints a fresh one.
ThenI cannot mint credentials for the user "{email}"Asserts that minting credentials that act as the given user is refused.

IAM grants​

TypeStepWhat it does
GivenWhenI create an email domain rule for "{domain}" granting the groups "{group_ids}" on the namespace "{namespace_id}"Creates a rule granting the given groups to everyone with an address in the domain.
GivenWhenI delete the email domain rule for "{domain}" on the namespace "{namespace_id}"Deletes a rule.
GivenWhenI grant the user "{email}" the groups "{group_ids}" on the namespace "{namespace_id}"Grants a user the given permission groups on a namespace.
GivenWhenI make the user "{email}" an administratorMakes a user a platform administrator.
GivenWhenThenI revoke the access of the user "{email}" to the namespace "{namespace_id}"Revokes a user's access to a namespace.
GivenWhenI revoke the administrator flag of the user "{email}"Takes the platform administrator flag away from a user.
WhenI change the groups of the user "{email}" on the namespace "{namespace_id}" to "{group_ids}"Replaces the permission groups a user holds on a namespace.
WhenI remove the property "{key}" for the user "{email}" on the namespace "{namespace_id}"Removes a property a user holds in a namespace.
WhenI set the property "{key}" to "{value}" for the user "{email}" on the namespace "{namespace_id}"Sets a property a user holds in a namespace.
Thena grant without groups is refused for the user "{email}" on the namespace "{namespace_id}"Asserts creating a grant that names no groups is refused.
Thena rule without groups is refused for "{domain}" on the namespace "{namespace_id}"Asserts creating a rule that names no groups is refused.
Thenapiv1.5 grants the acting identity the scope "{permission}" on "{resource}"Asserts apiv1.5 reports the given scope for the acting identity.
Thenapiv1.5 reports the acting identity as an administratorAsserts apiv1.5 agrees the acting identity is a platform administrator.
Thenapiv1.5 reports the groups "{group_ids}" for the acting identity on the namespace "{namespace_id}"Asserts apiv1.5 reads back the same groups the gateway wrote.
Thenchanging the groups of the user "{email}" on the namespace "{namespace_id}" to none is refusedAsserts emptying the groups of an existing grant is refused.
ThenI expect an IAM audit event by the acting identity about the user "{target}" containing the text "{log_substring}"Asserts an IAM audit event was emitted naming both the actor and the user it was about.
Thenthe account of the acting identity records no identity providerAsserts an account materialised by a client-credentials mint has no provider bound.
Thenthe acting identity can reach the datasources of the namespace "{namespace_id}"Asserts the acting identity is not refused on the datasources of a namespace.
Thenthe acting identity can read the grants of the namespace "{namespace_id}"Asserts the acting identity may list the grants of a namespace.
Thenthe acting identity can read their own accountAsserts the acting identity may read their own account without being an administrator.
Thenthe acting identity cannot create a rule on the namespace "{namespace_id}"Asserts the acting identity is refused when creating a rule on a namespace.
Thenthe acting identity cannot grant the user "{email}" on the namespace "{namespace_id}"Asserts the acting identity is refused when creating a grant on a namespace.
Thenthe acting identity cannot make the user "{email}" an administratorAsserts a non-administrator is refused when handing out the administrator flag.
Thenthe acting identity cannot read the account of the user "{email}"Asserts a non-administrator is refused when reading somebody else's account.
Thenthe acting identity cannot read the datasources of the namespace "{namespace_id}"Asserts the acting identity is refused on the datasources of a namespace.
Thenthe acting identity cannot read the grants of the namespace "{namespace_id}"Asserts the acting identity is refused when listing the grants of a namespace.
Thenthe acting identity cannot revoke the user "{email}" from the namespace "{namespace_id}"Asserts the acting identity is refused when revoking a grant on a namespace.
Thenthe acting identity has platform access on the namespace "{namespace_id}"Asserts apiv1.5 agrees the acting identity may reach a namespace.
Thenthe acting identity is refused on the namespace "{namespace_id}"Asserts apiv1.5 refuses the acting identity on a namespace.
Thenthe email domain rule for "{domain}" is listed on the namespace "{namespace_id}"Asserts a rule turns up in the listing of a namespace.
Thenthe email domain rule for "{domain}" on the namespace "{namespace_id}" grants the groups "{group_ids}"Asserts a rule names exactly the given groups.
Thenthe grant of the user "{email}" is listed on the namespace "{namespace_id}"Asserts the grant of a user turns up in the listing of a namespace.
Thenthe grant of the user "{email}" is not listed on the namespace "{namespace_id}"Asserts the grant of a user does not turn up in the listing of a namespace.
Thenthe user "{email}" cannot revoke their own administrator flagAsserts an administrator cannot take their own flag away.
Thenthe user "{email}" holds no grant on the namespace "{namespace_id}"Asserts a user holds no grant on a namespace.
Thenthe user "{email}" holds no property "{key}" on the namespace "{namespace_id}"Asserts a user holds no property of the given key in a namespace.
Thenthe user "{email}" holds the groups "{group_ids}" on the namespace "{namespace_id}"Asserts the grant of a user on a namespace names exactly the given groups.
Thenthe user "{email}" holds the property "{key}" with value "{value}" on the namespace "{namespace_id}"Asserts a user holds the given property in a namespace.
Thenthe user "{email}" is an administratorAsserts a user carries the platform administrator flag.
Thenthe user "{email}" is not an administratorAsserts a user does not carry the platform administrator flag.
Thenthere is no email domain rule for "{domain}" on the namespace "{namespace_id}"Asserts no rule exists for the given domain.

Permission groups​

TypeStepWhat it does
GivenI create the group "{group_name}" from file "{file_name}"Create group using json payload from file.
GivenI upload all permission groups matching the regex pattern "{pattern}" using the default resource managerNo description yet
GivenI upload all permission groups matching the regex pattern "{pattern}" using the resource manager with name "{manager_name}"Uploads all permission groups whose names match the given regex pattern using a specified resource manager.
GivenI upload all permission groups using the default resource managerNo description yet
GivenI upload all permission groups using the resource manager with name "{manager_name}"Uploads all permission groups using a specified resource manager.
GivenI upload the permission group with name "{name}" using the default resource managerNo description yet
GivenI upload the permission group with name "{name}" using the resource manager with name "{manager_name}"Uploads a permission group with given name using a specified resource manager.
WhenI set permission scope to "{state_to_set}" for group "{group_name}"Set scopes for group stored in tests context dictionary.
WhenI update group "{group_name}" using template "{file_name}"Update group properties using json file template.
ThenI cannot update group "{group_name}" with property "{property_name}" being blankVerify that group without cannot be updated if name property specified incorrectly.
Thenthe group "{group_name}" contains scope property "{attribute}" with value "{value}"Verify that group have property.
Thenthe group "{group_name}" contains the attribute "{attribute}" with value "{value}"Verify that group have property.
Thenthe group "{group_name}" do not have scopesVerify that created group do not have scopes.
Thenthe group "{group_name}" is createdGet group details and verify that it exists.
Thenthe group "{group_name}" is deletedDelete created group that saved in test context dictionary.
Thenthe group "{group_name}" is in "{state_to_check}"Verify that group blacklisted or whitelisted.
Thenthe group with blank property "{property_name}" cannot be createdCreate new group and verify that is not possible due to name object is empty.

Process monitoring (Promo)​

TypeStepWhat it does
GivenThenI check the following metrics for the promo config with the name "{name_promo}":Checks multiple metrics of a promo config in a single polling cycle using a DataTable.
GivenThenI check the metric with the name "{metric_name}" has value "{value}" for the promo config with the name "{name_promo}"Checks the metrics of the instance.
GivenThenI check the number of promo configs is equal "{amount:d}"Checks the amount of promo configurations that exist in the namespace.
GivenI create all promo configs from "{file_name}"Creates all promo configurations present in a given file.
GivenWhenI delete the promo config "{name}"Delete the promo config.
GivenI try to create invalid promo config from "{file_name}" and expect status code "{status_code:d}" and message "{message}"No description yet
ThenI assign the flow design with name "{flow_design_name}" to promo config "{name}"Assigns a flow design to promo configuration.
ThenI assign the market adapter with name "{ma_name}" to promo config "{name}"Assigns a market adapter to promo configuration.
ThenI check if the flow design with name "{flow_design_name}" is assigned to "{name}" configChecks if a flow design is assigned to a promo.
ThenI check if the market adapter with name "{ma_name}" is assigned to "{name}" configChecks if a market adapter is assigned to a promo.
ThenI expect a promo config with the name "{name}" to have the attribute "{attr}" with the value "{value}"Checks if the value of an attribute in the promo config.
ThenI update the attribute "{attr}" with value "{value}" in promo config "{name}"Updates the attribute with given value in the promo config.

Audit events​

TypeStepWhat it does
ThenI expect an audit event with severity "{severity}" and contains the text "{log_substring}"Step that periodically searches for an audit event based on severity level, time and text.
ThenI expect an audit event with severity "{severity}" and contains the text "{log_substring}" within "{time_out_in_minutes:d}" minutes with a poll frequency of "{polling_freq_in_seconds:d}" secondsStep that searches for an audit event based on severity level, time and text.
ThenI expect new audit eventsStep to check for the existence of new audit events.

Resource manager​

TypeStepWhat it does
GivenI create a resource manager from the global configurations directoryNo description yet
GivenI create a resource manager with name "{manager_name}" from directory "{dirpath}"Creates a resource :class:`Manager` with `manager_name` from the provided `dirpath` to use for configuration management.
GivenI create a resource manager with name "{manager_name}" from directory "{dirpath}" with standard package rules "{rule_names_csv}"Creates a resource manager from a suite's configs merged with rules sourced from the standard package.
GivenI upload all configurations using the default resource managerNo description yet
GivenThenI upload all configurations using the resource manager with name "{manager_name}"Uploads all configurations stored in the specified resource manager.
GivenI upload the standard package rules "{rule_names_csv}"Uploads rules sourced directly from the ``standard_packages`` package (single source of truth).

Chatbot (EnerGPT)​

TypeStepWhat it does
GivenI expect a successful response when I send a question "{question_text}" to energychatSend a question to the energychat endpoint and verify a successful response.
GivenI greet the chatbotGreet the chatbot to initialize a session with a default persona.

Test utilities​

Queries (EQL)​

TypeStepWhat it does
ThenI should be able to find datasource "{datasource_id}" with query "{query}"Search datasource by id and filter with Query request.
ThenI use advanced search to check in tag "{tag_key}" the property "{property_key}" with value "{property_value}" for datasource "{datasource_id}"Uses advanced search to check the value a tag property holds in its latest version.
ThenI use advanced search to check that previous version of a datapoint is saved with the value "{value}" for the timestamp "{timestamp}" for the channel "{channel_name}" on a datasource with id "{datasource_id}"Uses advanced search to check the value of a previous datapoint version.
ThenI use advanced search to check the annotation "{annotation_name}" with the key "{annotation_key}" on the sequence id "{sequence_id}" has a value "{value}" for the timestamp "{timestamp}" for the channel "{channel_name}" on a datasource with id "{datasource_id}"Uses advanced search to check the DPA value of a datapoint.
ThenI use advanced search to check the annotation "{annotation_name}" with the key "{annotation_key}" on the sequence id "{sequence_id}" has a value "{value}" for the timestamp "{timestamp}" for the channel "{channel_name}" on a datasource with id "{datasource_id}" after {...}Uses advanced search to check the annotation value of a datapoint after ingestion.
ThenI use advanced search to check the datapoint attribute "{dpa_name}" value is "{value}" for the timestamp "{timestamp}" for the channel "{channel_name}" on a datasource with id "{datasource_id}"Uses advanced search to check the DPA value of a datapoint.
ThenI use advanced search to check the datapoint attribute "{dpa_name}" value is "{value}" for the timestamp "{timestamp}" for the channel "{channel_name}" on a datasource with id "{datasource_id}" after {...}Uses advanced search to check the DPA value of a datapoint.
ThenI use advanced search to check the datapoint value is "{value}" for the timestamp "{timestamp}" for the channel "{channel_name}" on a datasource with id "{datasource_id}"Uses advanced search to check the value of a datapoint.
ThenI use advanced search to check the datapoint value is "{value}" for the timestamp "{timestamp}" for the channel "{channel_name}" on a datasource with id "{datasource_id}" after {...}Uses advanced search to check the datapoint value of a datapoint after ingestion.
ThenI use advanced search to check the following annotation values with sequence id "{sequence_id}" on datasource "{datasource_id}":Uses advanced search to check multiple annotation values in a single BQ query per poll cycle.
ThenI use advanced search to check the following datapoint values on datasource "{datasource_id}" after {...}:Uses advanced search to check multiple datapoint values in a single BQ query per poll cycle.
ThenI use advanced search to check the following datapoint values on datasource "{datasource_id}":Uses advanced search to check multiple datapoint values in a single BQ query per poll cycle.
ThenI use advanced search to check the following DPA values for channel "{channel_name}" at timestamp "{timestamp}" on a datasource with id "{datasource_id}":Uses advanced search to check multiple DPA values for a single (channel, timestamp) in one BQ query.
Thenthe datasources table should show "{expected_count}" versions? for datasource "{datasource_id}"Verifies the exact number of versions stored in the datasources table for a datasource.
Thenthe latest version in the datasources table for datasource "{datasource_id}" should have the following attributes:Verifies the latest version of a datasource in the raw datasources table has expected attributes.
Thenthe latest_datasources view should show datasource "{datasource_id}" and channel "{channel_name}" with the following attributes:Verifies that the latest_datasources view contains a channel with expected attributes.
Thenthe latest_datasources view should show datasource "{datasource_id}" and channel classifier "{channel_classifier}" with the following attributes:Verifies a channel in the latest_datasources view, located by its classifier.
Thenthe latest_datasources view should show datasource "{datasource_id}" with the following attributes:Verifies that the latest_datasources view contains a datasource with expected attributes.

Polling​

TypeStepWhat it does
GivenWhenThenI wait for "{amount_in_secs:d}" secondsPauses the tests for a given amount of seconds.
ThenI do following steps with a timeout of "{timeout}" minutes and a poll frequency of "{poll_freq}" secondsSets the timeout and poll frequency in the context to be used for certain requests that need to wait for results.

Generic objects​

TypeStepWhat it does
GivenWhenI change the "{key}" attribute of the "{obj_type_name}" with name "{name}" to "{value}"Updates a string attribute of a certain object with valid value.
GivenWhenI delete all "{obj_type_name}" from the target namespaceDeletes every object of the given type from the target namespace.
GivenThenthe "{obj_type_name}" with the id "{obj_id}" does not existChecks if an object with a given ID exists.
GivenThenthe "{obj_type_name}" with the id "{obj_id}" existsChecks if an object with a given ID exists.
GivenThenthe "{obj_type_name}" with the name "{obj_name}" does not existChecks if an object with a given name does not exist.
GivenWhenThenthe "{obj_type_name}" with the name "{obj_name}" existsChecks if an object with a given name exists.
WhenI cannot create a "{obj_type_name}" with invalid configuration file "{file_name}"Try to create an object of the given type from invalid configuration file.
WhenI cannot update nonexistent "{obj_type_name}" with configuration file "{file_name}"Try to create an object of the given type from invalid configuration file.
WhenThenI delete the "{obj_type_name}" with the name "{name}"Delete an object by name.
WhenI update the "{obj_type_name}" with the name "{name}" with configuration file "{file_name}"Update an object using a file.
Thenchanging the "{key}" attribute of the "{obj_type_name}" with name "{name}" to "{value}" returns a Bad RequestUpdates a string attribute of a certain object with invalid value.
ThenI cannot get a "{obj_type_name}" by nonexistent id "{nonexistent_id}"Try to get an object by nonexistent id.
ThenI cannot get deleted "{obj_type_name}" by idTry to get deleted/nonexistent object by id.
ThenI get the "{obj_type_name}" by id and verify all updated fieldsGet an object by id and verify it was updated as expected.

API clients​

TypeStepWhat it does
GivenI purge all dataPurges all data from the target namespace.
GivenI purge all data I have permission to deletePurges all data from the target namespace the user has permission to list.
GivenI purge all data I have permission to delete on namespace "{namespace_name}"Purges all data from the target namespace the user has permission to list.
GivenThenI switch to api version "{api_version}"Switches between API 1.5 and 2 versions.
GivenI use the namespace with the name "{nsp_name}"This step is used to get the namespace id by name and set it for the test run.