From f15f5fc17535f295c772ff7b4af5725da23a659a Mon Sep 17 00:00:00 2001 From: Julius Remigio <14811322+juls858@users.noreply.github.com> Date: Tue, 8 Aug 2023 11:51:42 -0700 Subject: [PATCH] STREAM-382/marketplace-tests (#33) --- .github/workflows/dbt_test.yml | 71 +++++++ analysis/generate_test_udf_skeleton.sql | 45 ++++ cspell.yml | 14 ++ dbt_project.yml | 5 +- macros/core/functions.py.sql | 9 +- macros/core/utils.yaml.sql | 52 ++++- macros/livequery/manage_udfs.sql | 18 +- macros/marketplace/alchemy/util_udfs.yaml.sql | 2 +- .../footprint/address_udfs.yaml.sql | 15 -- .../footprint/balances_udfs.yaml.sql | 51 ----- .../marketplace/footprint/chain_udfs.yaml.sql | 24 --- .../marketplace/footprint/chart_udfs.yaml.sql | 25 --- .../footprint/gamefi_udfs.yaml.sql | 69 ------ .../marketplace/footprint/nft_udfs.yaml.sql | 123 ----------- .../marketplace/footprint/token_udfs.yaml.sql | 15 -- .../marketplace/footprint/util_udfs.yaml.sql | 30 ++- macros/marketplace/helius/util_udfs.yaml.sql | 16 +- .../quicknode/ethereum_nft_udfs.yaml.sql | 2 +- .../quicknode/ethereum_token_udfs.yaml.sql | 2 +- .../quicknode/polygon_nft_udfs.yaml.sql | 2 +- .../quicknode/polygon_token_udfs.yaml.sql | 2 +- .../quicknode/solana_nft_udfs.yaml.sql | 2 +- .../marketplace/quicknode/util_udfs.yaml.sql | 8 +- macros/tests/udfs.sql | 35 +++ models/deploy/core/_utils.yml | 3 +- models/deploy/core/live.sql | 2 +- models/deploy/core/utils.yml | 199 +++++++++++++++++- .../alchemy/alchemy_nfts__alchemy_utils.yml | 194 +++++++++++++++++ .../alchemy/alchemy_tokens__alchemy_utils.yml | 32 +++ .../alchemy_transfers__alchemy_utils.yml | 13 ++ .../marketplace/bitquery/bitquery__.yml | 38 ++++ .../blockpour/blockpour_utils__.yml | 29 +++ .../chainbase/chainbase_utils__.yml | 18 ++ .../marketplace/credmark/credmark_utils__.yml | 30 +++ .../marketplace/dapplooker/dapplooker__.yml | 13 ++ .../footprint_utils__footprint_utils.yml | 18 ++ models/deploy/marketplace/fred/fred__.sql | 2 +- models/deploy/marketplace/fred/fred__.yml | 15 ++ .../helius/helius_apis__helius_utils.sql | 2 +- .../helius/helius_apis__helius_utils.yml | 43 ++++ .../helius/helius_das__helius_utils.yml | 114 ++++++++++ .../helius/helius_utils__helius_utils.sql | 2 +- .../marketplace/playgrounds/playgrounds__.yml | 44 ++++ ...icknode_ethereum_nfts__quicknode_utils.sql | 4 +- ...icknode_ethereum_nfts__quicknode_utils.yml | 84 ++++++++ ...knode_ethereum_tokens__quicknode_utils.sql | 4 +- ...knode_ethereum_tokens__quicknode_utils.yml | 63 ++++++ ...uicknode_polygon_nfts__quicknode_utils.sql | 4 +- ...uicknode_polygon_nfts__quicknode_utils.yml | 85 ++++++++ ...cknode_polygon_tokens__quicknode_utils.sql | 4 +- ...cknode_polygon_tokens__quicknode_utils.yml | 63 ++++++ ...quicknode_solana_nfts__quicknode_utils.sql | 4 +- ...quicknode_solana_nfts__quicknode_utils.yml | 34 +++ ...l => quicknode_utils__quicknode_utils.sql} | 2 +- .../marketplace/strangelove/strangelove__.yml | 15 ++ .../marketplace/subquery/subquery__.sql | 2 +- .../marketplace/subquery/subquery__.yml | 13 ++ tests/generic/test_udf.sql | 27 +-- 58 files changed, 1461 insertions(+), 395 deletions(-) create mode 100644 .github/workflows/dbt_test.yml create mode 100644 analysis/generate_test_udf_skeleton.sql delete mode 100644 macros/marketplace/footprint/address_udfs.yaml.sql delete mode 100644 macros/marketplace/footprint/balances_udfs.yaml.sql delete mode 100644 macros/marketplace/footprint/chain_udfs.yaml.sql delete mode 100644 macros/marketplace/footprint/chart_udfs.yaml.sql delete mode 100644 macros/marketplace/footprint/gamefi_udfs.yaml.sql delete mode 100644 macros/marketplace/footprint/nft_udfs.yaml.sql delete mode 100644 macros/marketplace/footprint/token_udfs.yaml.sql create mode 100644 macros/tests/udfs.sql create mode 100644 models/deploy/marketplace/alchemy/alchemy_nfts__alchemy_utils.yml create mode 100644 models/deploy/marketplace/alchemy/alchemy_tokens__alchemy_utils.yml create mode 100644 models/deploy/marketplace/alchemy/alchemy_transfers__alchemy_utils.yml create mode 100644 models/deploy/marketplace/bitquery/bitquery__.yml create mode 100644 models/deploy/marketplace/blockpour/blockpour_utils__.yml create mode 100644 models/deploy/marketplace/chainbase/chainbase_utils__.yml create mode 100644 models/deploy/marketplace/credmark/credmark_utils__.yml create mode 100644 models/deploy/marketplace/dapplooker/dapplooker__.yml create mode 100644 models/deploy/marketplace/footprint/footprint_utils__footprint_utils.yml create mode 100644 models/deploy/marketplace/fred/fred__.yml create mode 100644 models/deploy/marketplace/helius/helius_apis__helius_utils.yml create mode 100644 models/deploy/marketplace/helius/helius_das__helius_utils.yml create mode 100644 models/deploy/marketplace/playgrounds/playgrounds__.yml create mode 100644 models/deploy/marketplace/quicknode/quicknode_ethereum_nfts__quicknode_utils.yml create mode 100644 models/deploy/marketplace/quicknode/quicknode_ethereum_tokens__quicknode_utils.yml create mode 100644 models/deploy/marketplace/quicknode/quicknode_polygon_nfts__quicknode_utils.yml create mode 100644 models/deploy/marketplace/quicknode/quicknode_polygon_tokens__quicknode_utils.yml create mode 100644 models/deploy/marketplace/quicknode/quicknode_solana_nfts__quicknode_utils.yml rename models/deploy/marketplace/quicknode/{quicknode_utils__qicknode_utils.sql => quicknode_utils__quicknode_utils.sql} (76%) create mode 100644 models/deploy/marketplace/strangelove/strangelove__.yml create mode 100644 models/deploy/marketplace/subquery/subquery__.yml diff --git a/.github/workflows/dbt_test.yml b/.github/workflows/dbt_test.yml new file mode 100644 index 0000000..1c5eef0 --- /dev/null +++ b/.github/workflows/dbt_test.yml @@ -0,0 +1,71 @@ +name: dbt_tests +run-name: ${{ inputs.dbt_command }} + +on: + workflow_dispatch: + inputs: + environment: + type: choice + description: DBT Run Environment + required: true + options: + - dev + - prod + default: dev + warehouse: + type: choice + description: Snowflake warehouse + required: true + options: + - DBT + - DBT_CLOUD + - DBT_EMERGENCY + default: DBT + dbt_command: + type: string + description: 'DBT Run Command' + required: true + +env: + DBT_PROFILES_DIR: ./ + + ACCOUNT: "${{ vars.ACCOUNT }}" + ROLE: "${{ vars.ROLE }}" + USER: "${{ vars.USER }}" + PASSWORD: "${{ secrets.PASSWORD }}" + REGION: "${{ vars.REGION }}" + DATABASE: "${{ vars.DATABASE }}" + WAREHOUSE: "${{ inputs.warehouse }}" + SCHEMA: "${{ vars.SCHEMA }}" + +concurrency: + group: ${{ github.workflow }} + +jobs: + run_tests: + runs-on: ubuntu-latest + environment: + name: workflow_${{ inputs.environment }} + + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-python@v4 + with: + python-version: "3.10" + cache: "pip" + + + - name: install dependencies + run: | + pip install -r requirements.txt + dbt deps + - name: Run DBT Jobs + run: | + dbt --debug test ${{ inputs.dbt_command }} + + - name: Store logs + uses: actions/upload-artifact@v3 + with: + name: dbt-logs + path: logs \ No newline at end of file diff --git a/analysis/generate_test_udf_skeleton.sql b/analysis/generate_test_udf_skeleton.sql new file mode 100644 index 0000000..2e59e38 --- /dev/null +++ b/analysis/generate_test_udf_skeleton.sql @@ -0,0 +1,45 @@ +{% set schema = "strangelove" %} +{% set config = fromyaml(config_strangelove_udfs(schema_name = schema, utils_schema_name = "quicknode_utils")) %} +{% set raw_test_queries %} +strangelove.get: + - | + 'https://api.strange.love/cosmoshub/mainnet/rpc/block_by_hash' + - | + { + 'blockHash': '0xD70952032620CC4E2737EB8AC379806359D8E0B17B0488F627997A0B043ABDED' + } + + +strangelove.post: + - | + 'https://endpoint' + - | + { + 'foo': 'bar' + } + +{% endset %} +{% set test_queries = fromyaml(raw_test_queries) %} +{{ test_queries }} +{{ schema }} +_____ + columns: +{%- for item in config %} + - name: {{ item["name"] | replace(schema~".", "") }} + tests: + - test_marketplace_udf: + name: test_{{ item["name"].replace(".", "__") ~ "_status_200" }} + args: > + {{ test_queries[item["name"]] | join(", ") | indent(16) }} + validations: + - result:status_code = 200 +{%- endfor %} + +===================== + +{{ config | pprint}} +{# {% for item in config %} +{% if item["return_type"][0] != "VARIANT"%} + {{ item["return_type"][0] }} +{% endif %} +{% endfor %} #} \ No newline at end of file diff --git a/cspell.yml b/cspell.yml index 5e49b14..5c7e357 100644 --- a/cspell.yml +++ b/cspell.yml @@ -1,7 +1,21 @@ version: "0.2" language: en words: + - aave + - bitquery + - blockpour + - chainbase + - credmark + - dapplooker + - doseq - fromyaml - GETVARIABLE + - helius + - keccak - livequery + - quicknode + - reingest + - solana + - strangelove + - subquery - udfs diff --git a/dbt_project.yml b/dbt_project.yml index 2d1a0fd..0eb635c 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -58,7 +58,8 @@ vars: UPDATE_SNOWFLAKE_TAGS: true STREAMLINE_INVOKE_STREAMS: False STREAMLINE_USE_DEV_FOR_EXTERNAL_TABLES: False - REST_API_ID_PROD: hn8uqhku77 - REST_API_ID_DEV: hn8uqhku77 + REST_API_ID_PROD: ARPK1G9P37 + REST_API_ID_DEV: QG6A9ZS6R7 API_INTEGRATION: AWS_LIVE_QUERY{{ '_DEV' if target.name != 'prod' else '' }} AWS_REGION: us-east-1 + STUDIO_TEST_USER_ID: 98d15c30-9fa5-43cd-9c69-3d4c0bb269f5 diff --git a/macros/core/functions.py.sql b/macros/core/functions.py.sql index 18c5ec9..0c46045 100644 --- a/macros/core/functions.py.sql +++ b/macros/core/functions.py.sql @@ -83,10 +83,13 @@ def get_simplified_signature(abi): {% macro python_object_to_url_query_string() %} -import urllib.parse +from urllib.parse import urlencode -def object_to_url_query_string(variant_object): - return f'{urllib.parse.urlencode(variant_object)}' +def object_to_url_query_string(query, doseq=False): + {# return type(query) #} + if isinstance(query, dict): + return urlencode(query, doseq) + return urlencode([tuple(i) for i in query], doseq) {% endmacro %} diff --git a/macros/core/utils.yaml.sql b/macros/core/utils.yaml.sql index 440ce72..8aa5e47 100644 --- a/macros/core/utils.yaml.sql +++ b/macros/core/utils.yaml.sql @@ -140,18 +140,66 @@ sql: | {{ sql_udf_json_rpc_call(False) }} -- name: {{ schema }}.udf_object_to_url_query_string +- name: {{ schema }}.udf_urlencode signature: - - [object, OBJECT] + - [query, OBJECT] + - [doseq, BOOLEAN] return_type: TEXT options: | NULL LANGUAGE PYTHON IMMUTABLE RUNTIME_VERSION = '3.8' + COMMENT=$$Pthon (function)[https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode] to convert an object to a URL query string.$$ HANDLER = 'object_to_url_query_string' sql: | {{ python_object_to_url_query_string() | indent(4) }} +- name: {{ schema }}.udf_urlencode + signature: + - [query, ARRAY] + - [doseq, BOOLEAN] + return_type: TEXT + options: | + NULL + LANGUAGE PYTHON + IMMUTABLE + RUNTIME_VERSION = '3.8' + COMMENT=$$Pthon (function)[https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode] to convert an array to a URL query string.$$ + HANDLER = 'object_to_url_query_string' + sql: | + {{ python_object_to_url_query_string() | indent(4) }} +- name: {{ schema }}.udf_urlencode + signature: + - [query, ARRAY] + return_type: TEXT + options: | + NULL + LANGUAGE SQL + RETURNS NULL ON NULL INPUT + IMMUTABLE + sql: | + SELECT {{ schema }}.udf_urlencode(query, FALSE) +- name: {{ schema }}.udf_urlencode + signature: + - [query, OBJECT] + return_type: TEXT + options: | + NULL + LANGUAGE SQL + RETURNS NULL ON NULL INPUT + IMMUTABLE + sql: | + SELECT {{ schema }}.udf_urlencode(query, FALSE) +- name: {{ schema }}.udf_object_to_url_query_string + signature: + - [object, OBJECT] + return_type: TEXT + options: | + NOT NULL + RETURNS NULL ON NULL INPUT + IMMUTABLE + sql: SELECT utils.udf_urlencode(object, FALSE) + - name: {{ schema }}.udf_evm_transform_log signature: - [decoded, VARIANT] diff --git a/macros/livequery/manage_udfs.sql b/macros/livequery/manage_udfs.sql index 1bde3d9..65096d9 100644 --- a/macros/livequery/manage_udfs.sql +++ b/macros/livequery/manage_udfs.sql @@ -156,7 +156,11 @@ {% set sql %} {{- crud_udfs(config, this.schema, var("DROP_UDFS_AND_SPS")) -}} {%- endset -%} - {%- do log("Deploy core udfs: " ~ this.database ~ "." ~ this.schema, true) -%} + {%- if var("DROP_UDFS_AND_SPS") -%} + {%- do log("Drop core udfs: " ~ this.database ~ "." ~ this.schema, true) -%} + {%- else -%} + {%- do log("Deploy core udfs: " ~ this.database ~ "." ~ this.schema, true) -%} + {%- endif -%} {%- do run_query(sql ~ apply_grants_by_schema(this.schema)) -%} {% else -%} SELECT '{{ model.schema }}' as schema_ @@ -177,7 +181,11 @@ {{- crud_udfs_by_chain(config, blockchain, network, var("DROP_UDFS_AND_SPS")) -}} {%- endfor -%} {%- endset -%} - {%- do log("Deploy partner udfs: " ~ this.database ~ "." ~ schema, true) -%} + {%- if var("DROP_UDFS_AND_SPS") -%} + {%- do log("Drop partner udfs: " ~ this.database ~ "." ~ schema, true) -%} + {%- else -%} + {%- do log("Deploy partner udfs: " ~ this.database ~ "." ~ schema, true) -%} + {%- endif -%} {%- do run_query(sql ~ apply_grants_by_schema(schema)) -%} {% else -%} SELECT '{{ model.schema }}' as schema_ @@ -197,7 +205,11 @@ {{- crud_udfs_by_marketplace(config, schema, utility_schema, var("DROP_UDFS_AND_SPS")) -}} {%- endfor -%} {%- endset -%} - {%- do log("Deploy marketplace udfs: " ~ this.database ~ "." ~ schema, true) -%} + {%- if var("DROP_UDFS_AND_SPS") -%} + {%- do log("Drop marketplace udfs: " ~ this.database ~ "." ~ schema, true) -%} + {%- else -%} + {%- do log("Deploy marketplace udfs: " ~ this.database ~ "." ~ schema, true) -%} + {%- endif -%} {%- do run_query(sql ~ apply_grants_by_schema(schema)) -%} {% else -%} SELECT '{{ model.schema }}' as schema_ diff --git a/macros/marketplace/alchemy/util_udfs.yaml.sql b/macros/marketplace/alchemy/util_udfs.yaml.sql index 7e75285..fcb9097 100644 --- a/macros/marketplace/alchemy/util_udfs.yaml.sql +++ b/macros/marketplace/alchemy/util_udfs.yaml.sql @@ -1,4 +1,4 @@ -{% macro config_alchemy_utils_udfs(schema = "alchemy_utils", utils_schema_name="alchemy_utils") -%} +{% macro config_alchemy_utils_udfs(schema_name = "alchemy_utils", utils_schema_name="alchemy_utils") -%} {# This macro is used to generate the alchemy base endpoints #} diff --git a/macros/marketplace/footprint/address_udfs.yaml.sql b/macros/marketplace/footprint/address_udfs.yaml.sql deleted file mode 100644 index 7a8f5cd..0000000 --- a/macros/marketplace/footprint/address_udfs.yaml.sql +++ /dev/null @@ -1,15 +0,0 @@ -{% macro config_footprint_address_udfs(schema_name = "footprint_address", utils_schema_name = "footprint_utils") -%} -{# - This macro is used to generate the footprint address endpoints - #} - -- name: {{ schema_name -}}.get_tx_stats_by_address - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the transactions statistics by a wallet address. [Footprint docs here](https://docs.footprint.network/reference/get_address-transactions-statistics).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/address/transactions/statistics") | trim}} - -{% endmacro %} \ No newline at end of file diff --git a/macros/marketplace/footprint/balances_udfs.yaml.sql b/macros/marketplace/footprint/balances_udfs.yaml.sql deleted file mode 100644 index dab9a5d..0000000 --- a/macros/marketplace/footprint/balances_udfs.yaml.sql +++ /dev/null @@ -1,51 +0,0 @@ -{% macro config_footprint_balances_udfs(schema_name = "footprint_balances", utils_schema_name = "footprint_utils") -%} -{# - This macro is used to generate the footprint balance endpoints - #} - -- name: {{ schema_name -}}.get_native_balance_by_address - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the native balance by a wallet address. [Footprint docs here](https://docs.footprint.network/reference/get_address-native-balance).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/address/native/balance") | trim}} - -- name: {{ schema_name -}}.get_all_nfts_owned_by_address - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns all NFTs owned by a wallet address. [Footprint docs here](https://docs.footprint.network/reference/get_nft-wallet-balance).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/nft/wallet/balance") | trim}} - -- name: {{ schema_name -}}.get_all_erc20_balance_by_address - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns all ERC20 balance by a wallet address. [Footprint docs here](https://docs.footprint.network/reference/get_address-erc20-balance).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/address/erc20/balance") | trim}} - -- name: {{ schema_name -}}.get_nft_owned_by_address - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the specified NFT owned by a wallet address. [Footprint docs here](https://docs.footprint.network/reference/get_nft-balance).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/nft/balance") | trim}} - -- name: {{ schema_name -}}.get_erc20_balance_by_address - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the specified ERC20 balance by a wallet address. [Footprint docs here](https://docs.footprint.network/reference/get_token-balance).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/token/balance") | trim}} - -{% endmacro %} \ No newline at end of file diff --git a/macros/marketplace/footprint/chain_udfs.yaml.sql b/macros/marketplace/footprint/chain_udfs.yaml.sql deleted file mode 100644 index b9828c6..0000000 --- a/macros/marketplace/footprint/chain_udfs.yaml.sql +++ /dev/null @@ -1,24 +0,0 @@ -{% macro config_footprint_chains_udfs(schema_name = "footprint_chains", utils_schema_name = "footprint_utils") -%} -{# - This macro is used to generate the Footprint token endpoints - #} - -- name: {{ schema_name -}}.get_chain_transactions - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the transactions of the chain. [Footprint docs here](https://docs.footprint.network/reference/get_chain-transactions).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/chain/transactions") | trim}} - -- name: {{ schema_name -}}.get_chains - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the basic information of all chains. [Footprint docs here](https://docs.footprint.network/reference/get_chain-info).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/chain/info") | trim}} - -{% endmacro %} \ No newline at end of file diff --git a/macros/marketplace/footprint/chart_udfs.yaml.sql b/macros/marketplace/footprint/chart_udfs.yaml.sql deleted file mode 100644 index 99cd636..0000000 --- a/macros/marketplace/footprint/chart_udfs.yaml.sql +++ /dev/null @@ -1,25 +0,0 @@ -{% macro config_footprint_charts_udfs(schema_name = "footprint_charts", utils_schema_name = "footprint_utils") -%} -{# - This macro is used to generate the Footprint Chart endpoints - #} - -- name: {{ schema_name -}}.get_chart_results - signature: - - [CHART_ID, VARCHAR, The chart ID] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns your Footprint chart data by a chart ID. [Footprint docs here](https://docs.footprint.network/reference/post_dataapi-card-chart-id-query).$$ - sql: | - SELECT - live.udf_api( - 'POST', - concat( - 'https://footprint.network/api/v1/dataApi/card/', CHART_ID, '/query' - ), - {'api-key': '{API_KEY}'}, - {}, - '_FSC_SYS/FOOTPRINT' - ) as response - -{% endmacro %} \ No newline at end of file diff --git a/macros/marketplace/footprint/gamefi_udfs.yaml.sql b/macros/marketplace/footprint/gamefi_udfs.yaml.sql deleted file mode 100644 index 695672f..0000000 --- a/macros/marketplace/footprint/gamefi_udfs.yaml.sql +++ /dev/null @@ -1,69 +0,0 @@ -{% macro config_footprint_gamefi_udfs(schema_name = "footprint_gamefi", utils_schema_name = "footprint_utils") -%} -{# - This macro is used to generate the Footprint Gamefi endpoints - #} - -- name: {{ schema_name -}}.get_protocols - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the basic information of the protocol. [Footprint docs here](https://docs.footprint.network/reference/get_protocol-info).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/protocol/info") | trim}} - -- name: {{ schema_name -}}.get_protocols_by_contract - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the basic information of the protocol by contract address. [Footprint docs here](https://docs.footprint.network/reference/get_protocol-info-by-contract).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/protocol/info/by-contract") | trim}} - -- name: {{ schema_name -}}.get_protocols_by_name - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the basic information of the protocol by name. [Footprint docs here](https://docs.footprint.network/reference/get_protocol-info-by-name).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/protocol/info/by-name") | trim}} - -- name: {{ schema_name -}}.get_protocol_active_users - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the active users of the protocol. [Footprint docs here](https://docs.footprint.network/reference/get_protocol-active-user).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/protocol/active-user") | trim}} - -- name: {{ schema_name -}}.get_protocol_active_user_stats - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the active user statistics data of the protocol. [Footprint docs here](https://docs.footprint.network/reference/get_protocol-active-user-statistics).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/protocol/active-user/statistics") | trim}} - -- name: {{ schema_name -}}.get_protocol_new_user_stats - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the new user statistics data of the protocol. [Footprint docs here](https://docs.footprint.network/reference/get_protocol-new-user-statistics).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/protocol/new-user/statistics") | trim}} - -- name: {{ schema_name -}}.get_protocol_stats - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the statistics metrics data of the protocol. [Footprint docs here](https://docs.footprint.network/reference/get_protocol-statistics).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/protocol/statistics") | trim}} - -{% endmacro %} \ No newline at end of file diff --git a/macros/marketplace/footprint/nft_udfs.yaml.sql b/macros/marketplace/footprint/nft_udfs.yaml.sql deleted file mode 100644 index f4d3814..0000000 --- a/macros/marketplace/footprint/nft_udfs.yaml.sql +++ /dev/null @@ -1,123 +0,0 @@ -{% macro config_footprint_nfts_udfs(schema_name = "footprint_nfts", utils_schema_name = "footprint_utils") -%} -{# - This macro is used to generate the Footprint nft endpoints - #} - -- name: {{ schema_name -}}.get_nft_txs_by_collection - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the sales record of the NFT collection in the marketplace. [Footprint docs here](https://docs.footprint.network/reference/get_nft-collection-transactions).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/nft/collection/transactions") | trim}} - -- name: {{ schema_name -}}.get_nft_transfers_by_collection - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the transfers record of the NFT collection. [Footprint docs here](https://docs.footprint.network/reference/get_nft-collection-transfers).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/nft/collection/transfers") | trim}} - -- name: {{ schema_name -}}.get_nft_listings - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the sales listing of the NFT in the marketplace. [Footprint docs here](https://docs.footprint.network/reference/get_nft-order-listings).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/nft/order/listings") | trim}} - -- name: {{ schema_name -}}.check_nft_wash_trade - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns whether the transaction hash is wash trading. [Footprint docs here](https://docs.footprint.network/reference/get_nft-collection-transactions-is-washtrade).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/nft/collection/transactions/is-washtrade") | trim}} - -- name: {{ schema_name -}}.get_nft_collection_stats - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the statistics metrics data of the specified NFT collection. [Footprint docs here](https://docs.footprint.network/reference/get_nft-collection-metrics).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/nft/collection/metrics") | trim}} - -- name: {{ schema_name -}}.get_nft_collection_floor_price_history - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the floor price history of the specified NFT collection. [Footprint docs here](https://docs.footprint.network/reference/get_nft-collection-floor-price-history).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/nft/collection/floor-price/history") | trim}} - -- name: {{ schema_name -}}.get_nft_collection_market_cap_history - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the market cap history of the specified NFT collection. [Footprint docs here](https://docs.footprint.network/reference/get_nft-collection-market-cap-history).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/nft/collection/market-cap/history") | trim}} - -- name: {{ schema_name -}}.get_nft_collection_volume_history - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the volume history of the specified NFT collection. [Footprint docs here](https://docs.footprint.network/reference/get_nft-collection-volume-history).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/nft/collection/volume/history") | trim}} - -- name: {{ schema_name -}}.get_nft_marketplace_stats - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the statistics metrics data of single NFT collection in the marketplace. [Footprint docs here](https://docs.footprint.network/reference/get_nft-marketplace-statistics).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/nft/marketplace/statistics") | trim}} - -- name: {{ schema_name -}}.get_nft_collections - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the basic information of the NFT collection. [Footprint docs here](https://docs.footprint.network/reference/get_nft-collection-info).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/nft/collection/info") | trim}} - -- name: {{ schema_name -}}.get_nft_tokens_by_collection - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the basic information of the NFT. [Footprint docs here](https://docs.footprint.network/reference/get_nft-info).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/nft/info") | trim}} - -- name: {{ schema_name -}}.get_nft_attributes - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the attributes of the NFT. [Footprint docs here](https://docs.footprint.network/reference/get_nft-attributes).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/nft/attributes") | trim}} - -- name: {{ schema_name -}}.get_nft_owners_by_collection - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the owners of the NFT. [Footprint docs here](https://docs.footprint.network/reference/get_nft-collection-owners).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/nft/collection/owners") | trim}} - -{% endmacro %} \ No newline at end of file diff --git a/macros/marketplace/footprint/token_udfs.yaml.sql b/macros/marketplace/footprint/token_udfs.yaml.sql deleted file mode 100644 index 3298742..0000000 --- a/macros/marketplace/footprint/token_udfs.yaml.sql +++ /dev/null @@ -1,15 +0,0 @@ -{% macro config_footprint_tokens_udfs(schema_name = "footprint_tokens", utils_schema_name = "footprint_utils") -%} -{# - This macro is used to generate the Footprint token endpoints - #} - -- name: {{ schema_name -}}.get_token_transfers - signature: - - [QUERY_PARAMS, OBJECT, The query parameters] - return_type: - - "VARIANT" - options: | - COMMENT = $$Returns the transfers record of the token. [Footprint docs here](https://docs.footprint.network/reference/get_token-transfers).$$ - sql: {{footprint_get_api_call(utils_schema_name, "/v2/token/transfers") | trim}} - -{% endmacro %} \ No newline at end of file diff --git a/macros/marketplace/footprint/util_udfs.yaml.sql b/macros/marketplace/footprint/util_udfs.yaml.sql index 5f253f6..6c91273 100644 --- a/macros/marketplace/footprint/util_udfs.yaml.sql +++ b/macros/marketplace/footprint/util_udfs.yaml.sql @@ -1,9 +1,29 @@ -{% macro config_footprint_utils_udfs(schema = "footprint_utils", utils_schema_name="footprint_utils") -%} +{% macro config_footprint_utils_udfs(schema_name = "footprint_utils", utils_schema_name="footprint_utils") -%} {# This macro is used to generate the Footprint base endpoints #} -- name: {{ schema -}}.get +- name: {{ schema_name -}}.get + signature: + - [PATH, STRING, The path starting with '/'] + - [QUERY_ARGS, ARRAY, The query arguments] + return_type: + - "VARIANT" + options: | + COMMENT = $$Used to issue a 'GET' request to the Footprint API.$$ + sql: | + SELECT + live.udf_api( + 'GET', + concat( + 'https://api.footprint.network/api', PATH, '?', + utils.udf_urlencode(QUERY_ARGS, TRUE) + ), + {'api-key': '{API_KEY}'}, + {}, + '_FSC_SYS/FOOTPRINT' + ) as response +- name: {{ schema_name -}}.get signature: - [PATH, STRING, The path starting with '/'] - [QUERY_ARGS, OBJECT, The query arguments] @@ -17,14 +37,14 @@ 'GET', concat( 'https://api.footprint.network/api', PATH, '?', - utils.udf_object_to_url_query_string(QUERY_ARGS) + utils.udf_urlencode(QUERY_ARGS, TRUE) ), {'api-key': '{API_KEY}'}, {}, '_FSC_SYS/FOOTPRINT' ) as response -- name: {{ schema -}}.post +- name: {{ schema_name -}}.post signature: - [PATH, STRING, The path starting with '/'] - [BODY, OBJECT, The request body] @@ -43,7 +63,7 @@ ) as response -- name: {{ schema -}}.rpc +- name: {{ schema_name -}}.rpc signature: - [METHOD, STRING, The RPC method to call] - [PARAMS, ARRAY, The RPC Params arguments] diff --git a/macros/marketplace/helius/util_udfs.yaml.sql b/macros/marketplace/helius/util_udfs.yaml.sql index 87e7155..9b7bd7a 100644 --- a/macros/marketplace/helius/util_udfs.yaml.sql +++ b/macros/marketplace/helius/util_udfs.yaml.sql @@ -1,4 +1,4 @@ -{% macro config_helius_util_udfs(schema = "helius_utils", utils_schema_name="helius_utils") -%} +{% macro config_helius_utils_udfs(schema = "helius_utils", utils_schema_name="helius_utils") -%} {# This macro is used to generate the Helius base endpoints #} @@ -15,10 +15,10 @@ sql: | SELECT live.udf_api( 'GET', - CASE - WHEN NETWORK = 'devnet' THEN + CASE + WHEN NETWORK = 'devnet' THEN concat('https://api-devnet.helius.xyz', PATH, '?api-key={API_KEY}&', utils.udf_object_to_url_query_string(QUERY_PARAMS)) - ELSE + ELSE concat('https://api.helius.xyz', PATH, '?api-key={API_KEY}&', utils.udf_object_to_url_query_string(QUERY_PARAMS)) END, {}, @@ -39,9 +39,9 @@ SELECT live.udf_api( 'POST', CASE - WHEN NETWORK = 'devnet' THEN + WHEN NETWORK = 'devnet' THEN concat('https://api-devnet.helius.xyz', PATH, '?api-key={API_KEY}') - ELSE + ELSE concat('https://api.helius.xyz', PATH, '?api-key={API_KEY}') END, {}, @@ -62,9 +62,9 @@ SELECT live.udf_api( 'POST', CASE - WHEN NETWORK = 'devnet' THEN + WHEN NETWORK = 'devnet' THEN 'https://devnet.helius-rpc.com?api-key={API_KEY}' - ELSE + ELSE 'https://rpc.helius.xyz?api-key={API_KEY}' END, {}, diff --git a/macros/marketplace/quicknode/ethereum_nft_udfs.yaml.sql b/macros/marketplace/quicknode/ethereum_nft_udfs.yaml.sql index 6cef5f0..587ae9c 100644 --- a/macros/marketplace/quicknode/ethereum_nft_udfs.yaml.sql +++ b/macros/marketplace/quicknode/ethereum_nft_udfs.yaml.sql @@ -1,4 +1,4 @@ -{% macro config_quicknode_ethereum_nft_udfs(schema_name = "quicknode_ethereum_nfts", utils_schema_name = "quicknode_utils") -%} +{% macro config_quicknode_ethereum_nfts_udfs(schema_name = "quicknode_ethereum_nfts", utils_schema_name = "quicknode_utils") -%} {# This macro is used to generate the QuickNode Ethereum NFT endpoints #} diff --git a/macros/marketplace/quicknode/ethereum_token_udfs.yaml.sql b/macros/marketplace/quicknode/ethereum_token_udfs.yaml.sql index f604c78..a5fc75a 100644 --- a/macros/marketplace/quicknode/ethereum_token_udfs.yaml.sql +++ b/macros/marketplace/quicknode/ethereum_token_udfs.yaml.sql @@ -1,4 +1,4 @@ -{% macro config_quicknode_ethereum_token_udfs(schema_name = "quicknode_ethereum_tokens", utils_schema_name = "quicknode_utils") -%} +{% macro config_quicknode_ethereum_tokens_udfs(schema_name = "quicknode_ethereum_tokens", utils_schema_name = "quicknode_utils") -%} {# This macro is used to generate the QuickNode Ethereum Token endpoints #} diff --git a/macros/marketplace/quicknode/polygon_nft_udfs.yaml.sql b/macros/marketplace/quicknode/polygon_nft_udfs.yaml.sql index d5c210c..fa1bbf7 100644 --- a/macros/marketplace/quicknode/polygon_nft_udfs.yaml.sql +++ b/macros/marketplace/quicknode/polygon_nft_udfs.yaml.sql @@ -1,4 +1,4 @@ -{% macro config_quicknode_polygon_nft_udfs(schema_name = "quicknode_polygon_nfts", utils_schema_name = "quicknode_utils") -%} +{% macro config_quicknode_polygon_nfts_udfs(schema_name = "quicknode_polygon_nfts", utils_schema_name = "quicknode_utils") -%} {# This macro is used to generate the QuickNode Polygon NFT endpoints #} diff --git a/macros/marketplace/quicknode/polygon_token_udfs.yaml.sql b/macros/marketplace/quicknode/polygon_token_udfs.yaml.sql index 6ca7c52..bf331bb 100644 --- a/macros/marketplace/quicknode/polygon_token_udfs.yaml.sql +++ b/macros/marketplace/quicknode/polygon_token_udfs.yaml.sql @@ -1,4 +1,4 @@ -{% macro config_quicknode_polygon_token_udfs(schema_name = "quicknode_polygon_tokens", utils_schema_name = "quicknode_utils") -%} +{% macro config_quicknode_polygon_tokens_udfs(schema_name = "quicknode_polygon_tokens", utils_schema_name = "quicknode_utils") -%} {# This macro is used to generate the QuickNode Polygon Token endpoints #} diff --git a/macros/marketplace/quicknode/solana_nft_udfs.yaml.sql b/macros/marketplace/quicknode/solana_nft_udfs.yaml.sql index e5d82dd..95cce85 100644 --- a/macros/marketplace/quicknode/solana_nft_udfs.yaml.sql +++ b/macros/marketplace/quicknode/solana_nft_udfs.yaml.sql @@ -1,4 +1,4 @@ -{% macro config_quicknode_solana_nft_udfs(schema_name = "quicknode_solana_nfts", utils_schema_name = "quicknode_utils") -%} +{% macro config_quicknode_solana_nfts_udfs(schema_name = "quicknode_solana_nfts", utils_schema_name = "quicknode_utils") -%} {# This macro is used to generate the QuickNode Solana NFT endpoints #} diff --git a/macros/marketplace/quicknode/util_udfs.yaml.sql b/macros/marketplace/quicknode/util_udfs.yaml.sql index b491ded..03a3811 100644 --- a/macros/marketplace/quicknode/util_udfs.yaml.sql +++ b/macros/marketplace/quicknode/util_udfs.yaml.sql @@ -1,9 +1,9 @@ -{% macro config_quicknode_util_udfs(schema = "quicknode_utils", utils_schema_name="quicknode_utils") -%} +{% macro config_quicknode_utils_udfs(schema_name = "quicknode_utils", utils_schema_name="quicknode_utils") -%} {# This macro is used to generate the QuickNode base endpoints/RPC calls #} -- name: {{ schema -}}.ethereum_mainnet_rpc +- name: {{ schema_name -}}.ethereum_mainnet_rpc signature: - [METHOD, STRING, The RPC method to call] - [PARAMS, OBJECT, The RPC Params arguments] @@ -20,7 +20,7 @@ '_FSC_SYS/QUICKNODE' ) as response -- name: {{ schema -}}.polygon_mainnet_rpc +- name: {{ schema_name -}}.polygon_mainnet_rpc signature: - [METHOD, STRING, The RPC method to call] - [PARAMS, OBJECT, The RPC Params arguments] @@ -37,7 +37,7 @@ '_FSC_SYS/QUICKNODE' ) as response -- name: {{ schema -}}.solana_mainnet_rpc +- name: {{ schema_name -}}.solana_mainnet_rpc signature: - [METHOD, STRING, The RPC method to call] - [PARAMS, OBJECT, The RPC Params arguments] diff --git a/macros/tests/udfs.sql b/macros/tests/udfs.sql new file mode 100644 index 0000000..a18d0b4 --- /dev/null +++ b/macros/tests/udfs.sql @@ -0,0 +1,35 @@ +{% macro base_test_udf(model, udf, args, assertions) %} +{# + Generates a test for a UDF. + #} +{% if execute %} + {%- set context -%} + SET LIVEQUERY_CONTEXT = '{"userId":"{{ var("STUDIO_TEST_USER_ID") }}"}'; + {%- endset -%} + {%- do run_query(context) -%} +{%- endif -%} +{%- set call -%} +{{ target.database }}.{{ udf }}({{ args }}) +{%- endset -%} +, +test AS +( + SELECT + '{{ udf }}' AS test_name + ,[{{ args }}] as parameters + ,{{ call }} AS result +) + {% for assertion in assertions %} + SELECT + test_name, + parameters, + result, + $${{ assertion }}$$ AS assertion, + $${{ context ~ "\n" }}SELECT {{ call ~ "\n" }};$$ AS sql + FROM test + WHERE NOT {{ assertion }} + {%- if not loop.last -%} + UNION ALL + {%- endif -%} + {%- endfor -%} +{%- endmacro -%} diff --git a/models/deploy/core/_utils.yml b/models/deploy/core/_utils.yml index c7c499e..1587558 100644 --- a/models/deploy/core/_utils.yml +++ b/models/deploy/core/_utils.yml @@ -5,4 +5,5 @@ models: tests: - test_udf: args: "'hello'" - expected: "'hello'" \ No newline at end of file + assertions: + - result = 'hello' \ No newline at end of file diff --git a/models/deploy/core/live.sql b/models/deploy/core/live.sql index 95312c7..9e088f2 100644 --- a/models/deploy/core/live.sql +++ b/models/deploy/core/live.sql @@ -2,4 +2,4 @@ -- depends_on: {{ ref('utils') }} -- depends_on: {{ ref('_live') }} {% set config = config_core_live %} -{{ ephemeral_deploy_core(config) }} \ No newline at end of file +{{ ephemeral_deploy_core(config) }} diff --git a/models/deploy/core/utils.yml b/models/deploy/core/utils.yml index e205556..dbc7486 100644 --- a/models/deploy/core/utils.yml +++ b/models/deploy/core/utils.yml @@ -1,3 +1,4 @@ +version: 2 models: - name: utils columns: @@ -5,10 +6,194 @@ models: tests: - test_udf: args: "'foo', [], 1" - expected: > - { - 'jsonrpc': '2.0', - 'method': 'foo', - 'params': [], - 'id': '1' - } + assertions: + - > + result = { + 'jsonrpc': '2.0', + 'method': 'foo', + 'params': [], + 'id': '1' + } + - name: udf_urlencode + tests: + - test_udf: + name: test_utils__udf_urlencode_dict_true_1 + args: > + {'a':'b'}, TRUE + assertions: + - result = 'a=b' + - test_udf: + name: test_utils__udf_urlencode_dict_true_2 + args: > + {'a':'a', 'b':'b'}, TRUE + assertions: + - result = 'a=a&b=b' + - test_udf: + name: test_utils__udf_urlencode_dict_true_space + args: > + {'space': 'abc 123'}, TRUE + assertions: + - result = 'space=abc+123' + - test_udf: + name: test_utils__udf_urlencode_dict_true_special + args: > + {'special!': ' !@#$,+"'}, TRUE + assertions: + - result = 'special%21=+%21%40%23%24%2C%2B%22' + - test_udf: + name: test_utils__udf_urlencode_dict_true_array + args: > + {'array': [0, 1, 2]}, TRUE + assertions: + - result = 'array=0&array=1&array=2' + - test_udf: + name: test_utils__udf_urlencode_dict_false_1 + args: > + {'a':'b'}, FALSE + assertions: + - result = 'a=b' + - test_udf: + name: test_utils__udf_urlencode_dict_false_2 + args: > + {'a':'b', 'b':'b'}, FALSE + assertions: + - result = 'a=b&b=b' + - test_udf: + name: test_utils__udf_urlencode_dict_false_space + args: > + {'space': 'abc 123'}, FALSE + assertions: + - result = 'space=abc+123' + - test_udf: + name: test_utils__udf_urlencode_dict_false_special + args: > + {'special!': ' !@#$,+"'}, FALSE + assertions: + - result = 'special%21=+%21%40%23%24%2C%2B%22' + - test_udf: + name: test_utils__udf_urlencode_dict_false_array + args: > + {'array': [0, 1, 2]}, FALSE + assertions: + - result = 'array=%5B0%2C+1%2C+2%5D' + - test_udf: + name: test_utils__udf_urlencode_dict_1 + args: > + {'a':'b'} + assertions: + - result = 'a=b' + - test_udf: + name: test_utils__udf_urlencode_dict_2 + args: > + {'a':'b', 'b':'b'} + assertions: + - result = 'a=b&b=b' + - test_udf: + name: test_utils__udf_urlencode_dict_space + args: > + {'space': 'abc 123'} + assertions: + - result = 'space=abc+123' + - test_udf: + name: test_utils__udf_urlencode_dict_special + args: > + {'special!': ' !@#$,+"'} + assertions: + - result = 'special%21=+%21%40%23%24%2C%2B%22' + - test_udf: + name: test_utils__udf_urlencode_dict_array + args: > + {'array': [0, 1, 2]} + assertions: + - result = 'array=%5B0%2C+1%2C+2%5D' + # write tests but use arrays of arrays instead of dictionaries + - test_udf: + name: test_utils__udf_urlencode_array_true_1 + args: > + [['a', 'b']], TRUE + assertions: + - result = 'a=b' + - test_udf: + name: test_utils__udf_urlencode_array_true_2 + args: > + [['a', 'a'], ['b', 'b']], TRUE + assertions: + - result = 'a=a&b=b' + - test_udf: + name: test_utils__udf_urlencode_array_true_space + args: > + [['space', 'abc 123']], TRUE + assertions: + - result = 'space=abc+123' + - test_udf: + name: test_utils__udf_urlencode_array_true_special + args: > + [['special!', ' !@#$,+"']], TRUE + assertions: + - result = 'special%21=+%21%40%23%24%2C%2B%22' + - test_udf: + name: test_utils__udf_urlencode_array_true_array + args: > + [['array', [0, 1, 2]]], TRUE + assertions: + - result = 'array=0&array=1&array=2' + - test_udf: + name: test_utils__udf_urlencode_array_false_1 + args: > + [['a', 'b']], FALSE + assertions: + - result = 'a=b' + - test_udf: + name: test_utils__udf_urlencode_array_false_2 + args: > + [['a', 'a'], ['b', 'b']], FALSE + assertions: + - result = 'a=a&b=b' + - test_udf: + name: test_utils__udf_urlencode_array_false_space + args: > + [['space', 'abc 123']], FALSE + assertions: + - result = 'space=abc+123' + - test_udf: + name: test_utils__udf_urlencode_array_false_special + args: > + [['special!', ' !@#$,+"']], FALSE + assertions: + - result = 'special%21=+%21%40%23%24%2C%2B%22' + - test_udf: + name: test_utils__udf_urlencode_array_false_array + args: > + [['array', [0, 1, 2]]], FALSE + assertions: + - result = 'array=%5B0%2C+1%2C+2%5D' + - test_udf: + name: test_utils__udf_urlencode_array_1 + args: > + [['a', 'b']] + assertions: + - result = 'a=b' + - test_udf: + name: test_utils__udf_urlencode_array_2 + args: > + [['a', 'a'], ['b', 'b']] + assertions: + - result = 'a=a&b=b' + - test_udf: + name: test_utils__udf_urlencode_array_space + args: > + [['space', 'abc 123']] + assertions: + - result = 'space=abc+123' + - test_udf: + name: test_utils__udf_urlencode_array_special + args: > + [['special!', ' !@#$,+"']] + assertions: + - result = 'special%21=+%21%40%23%24%2C%2B%22' + - test_udf: + name: test_utils__udf_urlencode_array_array + args: > + [['array', [0, 1, 2]]] + assertions: + - result = 'array=%5B0%2C+1%2C+2%5D' \ No newline at end of file diff --git a/models/deploy/marketplace/alchemy/alchemy_nfts__alchemy_utils.yml b/models/deploy/marketplace/alchemy/alchemy_nfts__alchemy_utils.yml new file mode 100644 index 0000000..0e8688e --- /dev/null +++ b/models/deploy/marketplace/alchemy/alchemy_nfts__alchemy_utils.yml @@ -0,0 +1,194 @@ +version: 2 +models: + - name: alchemy_nfts__alchemy_utils + columns: + - name: get_nfts + tests: + - test_udf: + name: test_alchemy_nfts__get_nfts_status_200 + args: > + 'eth-mainnet', {'owner': '0x4a9318F375937B56045E5a548e7E66AEA61Dd610'} + assertions: + - result:status_code = 200 + + - name: get_owners_for_token + tests: + - test_udf: + name: test_alchemy_nfts__get_owners_for_token_status_200 + args: > + 'eth-mainnet', {'contractAddress': '0xe785E82358879F061BC3dcAC6f0444462D4b5330', 'tokenId': 44} + assertions: + - result:status_code = 200 + + - name: get_owners_for_collection + tests: + - test_udf: + name: test_alchemy_nfts__get_owners_for_collection_status_200 + args: > + 'eth-mainnet', {'contractAddress': '0xe785E82358879F061BC3dcAC6f0444462D4b5330', 'withTokenBalances': True} + assertions: + - result:status_code = 200 + + - name: is_holder_of_collection + tests: + - test_udf: + name: test_alchemy_nfts__is_holder_of_collection_status_200 + args: > + 'eth-mainnet', {'wallet': '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', 'contractAddress': '0xe785E82358879F061BC3dcAC6f0444462D4b5330'} + assertions: + - result:status_code = 200 + + - name: get_contracts_for_owner + tests: + - test_udf: + name: test_alchemy_nfts__get_contracts_for_owner_status_200 + args: > + 'eth-mainnet', {'owner': 'vitalik.eth', 'pageSize': 100, 'page': 1} + assertions: + - result:status_code = 200 + + - name: get_nft_metadata + tests: + - test_udf: + name: test_alchemy_nfts__get_nft_metadata_status_200 + args: > + 'eth-mainnet', {'contractAddress': '0xe785E82358879F061BC3dcAC6f0444462D4b5330', 'tokenId': 44} + assertions: + - result:status_code = 200 + + - name: get_nft_metadata_batch + tests: + - test_udf: + name: test_alchemy_nfts__get_nft_metadata_batch_status_200 + args: > + 'eth-mainnet', {'tokens': [{'contractAddress': '0xe785E82358879F061BC3dcAC6f0444462D4b5330', 'tokenId': 44}, {'contractAddress': '0xe785E82358879F061BC3dcAC6f0444462D4b5330', 'tokenId': 43}]} + assertions: + - result:status_code = 200 + + - name: get_contract_metadata + tests: + - test_udf: + name: test_alchemy_nfts__get_contract_metadata_status_200 + args: > + 'ethereum-mainnet', {'contractAddress': '0xe785E82358879F061BC3dcAC6f0444462D4b5330'} + assertions: + - result:status_code = 200 + + - name: get_contract_metadata_batch + tests: + - test_udf: + name: test_alchemy_nfts__get_contract_metadata_batch_status_200 + args: > + 'eth-mainnet', {'contractAddresses': ['0xe785E82358879F061BC3dcAC6f0444462D4b5330', '0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d']} + assertions: + - result:status_code = 200 + + - name: invalidate_contract + tests: + - test_udf: + name: test_alchemy_nfts__invalidate_contract_status_200 + args: > + 'eth-mainnet', {'contractAddress': '0xe785E82358879F061BC3dcAC6f0444462D4b5330'} + assertions: + - result:status_code = 200 + + - name: reingest_contract + tests: + - test_udf: + name: test_alchemy_nfts__reingest_contract_status_200 + args: > + 'eth-mainnet', {'contractAddress': '0xe785E82358879F061BC3dcAC6f0444462D4b5330'} + assertions: + - result:status_code = 200 + + - name: search_contract_metadata + tests: + - test_udf: + name: test_alchemy_nfts__search_contract_metadata_status_200 + args: > + 'eth-mainnet', {'query': 'bored'} + assertions: + - result:status_code = 200 + + - name: get_nfts_for_collection + tests: + - test_udf: + name: test_alchemy_nfts__get_nfts_for_collection_status_200 + args: > + 'eth-mainnet', {'contractAddress': '0xe785E82358879F061BC3dcAC6f0444462D4b5330', 'withMetadata': True} + assertions: + - result:status_code = 200 + + - name: get_spam_contracts + tests: + - test_udf: + name: test_alchemy_nfts__get_spam_contracts_status_200 + args: > + 'eth-mainnet', {} + assertions: + - result:status_code = 200 + + - name: is_spam_contract + tests: + - test_udf: + name: test_alchemy_nfts__is_spam_contract_status_200 + args: > + 'eth-mainnet', {'contractAddress': '0xe785E82358879F061BC3dcAC6f0444462D4b5330'} + assertions: + - result:status_code = 200 + + - name: is_airdrop + tests: + - test_udf: + name: test_alchemy_nfts__is_airdrop_status_200 + args: > + 'eth-mainnet', {'contractAddress': '0xe785E82358879F061BC3dcAC6f0444462D4b5330', 'tokenId': 44} + assertions: + - result:status_code = 200 + + - name: report_spam + tests: + - test_udf: + config: + # we don't want to run this test in CI + enabled: false + name: test_alchemy_nfts__report_spam_status_200 + args: null + assertions: + - result:status_code = 200 + + - name: get_floor_price + tests: + - test_udf: + name: test_alchemy_nfts__get_floor_price_status_200 + args: > + 'eth-mainnet', {'contractAddress': '0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d'} + assertions: + - result:status_code = 200 + + - name: get_nft_sales + tests: + - test_udf: + name: test_alchemy_nfts__get_nft_sales_status_200 + args: > + 'eth-mainnet', {'fromBlock': 0, 'toBlock': 'latest', 'order': 'asc', 'contractAddress': '0xe785E82358879F061BC3dcAC6f0444462D4b5330', 'tokenId': 44} + assertions: + - result:status_code = 200 + + - name: compute_rarity + tests: + - test_udf: + name: test_alchemy_nfts__compute_rarity_status_200 + args: > + 'eth-mainnet', {'tokenId': 3603, 'contractAddress': '0xb6a37b5d14d502c3ab0ae6f3a0e058bc9517786e'} + assertions: + - result:status_code = 200 + + - name: summarize_nft_attributes + tests: + - test_udf: + name: test_alchemy_nfts__summarize_nft_attributes_status_200 + args: > + 'eth-mainnet', {'contractAddress': '0xb6a37b5d14d502c3ab0ae6f3a0e058bc9517786e'} + assertions: + - result:status_code = 200 diff --git a/models/deploy/marketplace/alchemy/alchemy_tokens__alchemy_utils.yml b/models/deploy/marketplace/alchemy/alchemy_tokens__alchemy_utils.yml new file mode 100644 index 0000000..2e275e7 --- /dev/null +++ b/models/deploy/marketplace/alchemy/alchemy_tokens__alchemy_utils.yml @@ -0,0 +1,32 @@ +version: 2 +models: + - name: alchemy_tokens__alchemy_utils + columns: + - name: get_token_allowance + tests: + - test_udf: + name: test_alchemy_tokens__get_token_allowance_status_200 + args: > + 'eth-mainnet', [{'contract': '0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270', 'owner': '0xf1a726210550c306a9964b251cbcd3fa5ecb275d', 'spender': '0xdef1c0ded9bec7f1a1670819833240f027b25eff'}] + assertions: + - result:status_code = 200 + + - name: get_token_balances + tests: + - test_udf: + name: test_alchemy_tokens__get_token_balances_status_200 + args: > + 'eth-mainnet', ['0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5', 'erc20'] + assertions: + - result:status_code = 200 + + - name: get_token_metadata + tests: + - test_udf: + name: test_alchemy_tokens__get_token_metadata_status_200 + args: > + 'eth-mainnet', ['0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'] + assertions: + - result:status_code = 200 + + diff --git a/models/deploy/marketplace/alchemy/alchemy_transfers__alchemy_utils.yml b/models/deploy/marketplace/alchemy/alchemy_transfers__alchemy_utils.yml new file mode 100644 index 0000000..1331485 --- /dev/null +++ b/models/deploy/marketplace/alchemy/alchemy_transfers__alchemy_utils.yml @@ -0,0 +1,13 @@ +version: 2 +models: + - name: alchemy_transfers__alchemy_utils + columns: + - name: get_asset_transfers + tests: + - test_udf: + name: test_alchemy_transfers__get_asset_transfers_status_200 + args: > + 'eth-mainnet', [{'fromBlock': '0x0', 'toBlock': 'latest', 'toAddress': '0x5c43B1eD97e52d009611D89b74fA829FE4ac56b1', 'category': ['external'], 'withMetadata': True, 'excludeZeroValue': True}] + assertions: + - result:status_code = 200 + diff --git a/models/deploy/marketplace/bitquery/bitquery__.yml b/models/deploy/marketplace/bitquery/bitquery__.yml new file mode 100644 index 0000000..ef0d424 --- /dev/null +++ b/models/deploy/marketplace/bitquery/bitquery__.yml @@ -0,0 +1,38 @@ +version: 2 +models: + - name: bitquery__ + columns: + - name: graphql + tests: + - test_udf: + name: test_bitquery__graphql_status_200 + args: > + { + 'query': '{ + ethereum( network: bsc ) { + dexTrades( + options: {limit: 1} + baseCurrency: {is: "0x6679eB24F59dFe111864AEc72B443d1Da666B360"} + quoteCurrency: {is: "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c"} + ) { + buyAmount + buyAmountInUsd: buyAmount(in: USD) + buyCurrency { + symbol + address + } + sellAmount + sellCurrency { + symbol + address + } + tradeAmount(in: USD) + } + } + }', + 'variables': '{}' + } + assertions: + - result:status_code = 200 + + diff --git a/models/deploy/marketplace/blockpour/blockpour_utils__.yml b/models/deploy/marketplace/blockpour/blockpour_utils__.yml new file mode 100644 index 0000000..3108f7b --- /dev/null +++ b/models/deploy/marketplace/blockpour/blockpour_utils__.yml @@ -0,0 +1,29 @@ +version: 2 +models: + - name: blockpour_utils__ + columns: + - name: get + tests: + - test_udf: + name: test_blockpour_utils__get_status_200 + args: > + '/v1/tokens/1/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', { + 'blockNumber': 17767007 + } + assertions: + - result:status_code = 200 + + - name: post + tests: + - test_udf: + name: test_blockpour_utils__post_status_200 + args: > + '/v1/model/run', { + 'slug': 'price.quote', + 'version': '1.0', + 'chainId': 1, + 'blockNumber': 17767016, + 'input': {} + } + assertions: + - result:status_code = 200 diff --git a/models/deploy/marketplace/chainbase/chainbase_utils__.yml b/models/deploy/marketplace/chainbase/chainbase_utils__.yml new file mode 100644 index 0000000..296e9a6 --- /dev/null +++ b/models/deploy/marketplace/chainbase/chainbase_utils__.yml @@ -0,0 +1,18 @@ +version: 2 +models: + - name: chainbase_utils__ + columns: + - name: get + tests: + - test_udf: + name: test_chainbase_utils__get_status_200 + args: > + '/v1/nft/metadata' + , { + 'chain_id': 1, + 'contract_address': '0xed5af388653567af2f388e6224dc7c4b3241c544', + 'token_id': 1 + } + assertions: + - result:status_code = 200 + diff --git a/models/deploy/marketplace/credmark/credmark_utils__.yml b/models/deploy/marketplace/credmark/credmark_utils__.yml new file mode 100644 index 0000000..6d1d322 --- /dev/null +++ b/models/deploy/marketplace/credmark/credmark_utils__.yml @@ -0,0 +1,30 @@ +version: 2 +models: + - name: credmark_utils__ + columns: + - name: get + tests: + - test_udf: + name: test_credmark_utils__get_status_200 + args: > + '/v1/tokens/1/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' + , { + 'blockNumber': 17767007 + } + assertions: + - result:status_code = 200 + + - name: post + tests: + - test_udf: + name: test_credmark_utils__post_status_200 + args: > + '/v1/model/run' + , { + 'slug': 'aave-v2.account-info', + 'chainId': 1, + 'blockNumber': 17725466, + 'input': {'address': '0xf89a3799b90593317E0a1Eb74164fbc1755A297A'} + } + assertions: + - result:status_code = 200 diff --git a/models/deploy/marketplace/dapplooker/dapplooker__.yml b/models/deploy/marketplace/dapplooker/dapplooker__.yml new file mode 100644 index 0000000..d2bbe06 --- /dev/null +++ b/models/deploy/marketplace/dapplooker/dapplooker__.yml @@ -0,0 +1,13 @@ +version: 2 +models: + - name: dapplooker__ + columns: + - name: get_chart + tests: + - test_udf: + name: test_dapplooker__get_chart_status_202 + args: > + 'a68cc6dd-1bc1-40ca-aaf8-b5155785f0b4' + assertions: + - result:status_code between 200 and 299 + diff --git a/models/deploy/marketplace/footprint/footprint_utils__footprint_utils.yml b/models/deploy/marketplace/footprint/footprint_utils__footprint_utils.yml new file mode 100644 index 0000000..d9b19f4 --- /dev/null +++ b/models/deploy/marketplace/footprint/footprint_utils__footprint_utils.yml @@ -0,0 +1,18 @@ +version: 2 +models: + - name: footprint_utils__footprint_utils + columns: + - name: get + tests: + - test_udf: + name: test_footprint_utils__get_status_200_v2_protocol_info + args: > + '/v2/protocol/info' + , { + 'chain': 'Ethereum', + 'protocol_slug': 'the-sandbox', + 'limit': 10, + 'offset': 0 + } + assertions: + - result:status_code = 200 diff --git a/models/deploy/marketplace/fred/fred__.sql b/models/deploy/marketplace/fred/fred__.sql index eaf1e32..3a65405 100644 --- a/models/deploy/marketplace/fred/fred__.sql +++ b/models/deploy/marketplace/fred/fred__.sql @@ -2,4 +2,4 @@ {%- set configs = [ config_fred_udfs, ] -%} -{{- ephemeral_deploy_marketplace(configs) -}} \ No newline at end of file +{{- ephemeral_deploy_marketplace(configs) -}} diff --git a/models/deploy/marketplace/fred/fred__.yml b/models/deploy/marketplace/fred/fred__.yml new file mode 100644 index 0000000..be7bcbe --- /dev/null +++ b/models/deploy/marketplace/fred/fred__.yml @@ -0,0 +1,15 @@ +version: 2 +models: + - name: fred__ + columns: + - name: get_series + tests: + - test_udf: + name: test_fred__get_series_status_200 + args: > + { + 'series_id': 'CORESTICKM679SFRBATL', + 'file_type': 'json' + } + assertions: + - result:status_code = 200 diff --git a/models/deploy/marketplace/helius/helius_apis__helius_utils.sql b/models/deploy/marketplace/helius/helius_apis__helius_utils.sql index 5fee2b6..11875dc 100644 --- a/models/deploy/marketplace/helius/helius_apis__helius_utils.sql +++ b/models/deploy/marketplace/helius/helius_apis__helius_utils.sql @@ -3,4 +3,4 @@ config_helius_apis_udfs, ] -%} {{- ephemeral_deploy_marketplace(configs) -}} --- depends_on: {{ ref('helius_utils__helius_utils') }} \ No newline at end of file +-- depends_on: {{ ref('helius_utils__helius_utils') }} diff --git a/models/deploy/marketplace/helius/helius_apis__helius_utils.yml b/models/deploy/marketplace/helius/helius_apis__helius_utils.yml new file mode 100644 index 0000000..ea96ba7 --- /dev/null +++ b/models/deploy/marketplace/helius/helius_apis__helius_utils.yml @@ -0,0 +1,43 @@ +version: 2 +models: + - name: helius_apis__helius_utils + columns: + - name: token_metadata + tests: + - test_udf: + name: test_helius_apis__token_metadata_status_200 + args: > + 'mainnet' + , { + 'mintAccounts': [ + 'BAAzgRGWY2v5AJBNZNFd2abiRXAUo56UxywKEjoCZW2', + '8s6kQUZfdm7GSaThAcsmSs56wMinXrbk6SdNVngutrz5' + ], + 'includeOffChain': true + } + assertions: + - result:status_code = 200 + + - name: balances + tests: + - test_udf: + name: test_helius_apis__balances_status_200 + args: > + 'mainnet' + , '231B38ZpsbtrWbsBEjSXfjVj9JT2XyuNXy4f98V5NXxg' + assertions: + - result:status_code = 200 + + - name: parse_transactions + tests: + - test_udf: + name: test_helius_apis__parse_transactions_status_200 + args: > + 'mainnet' + , [ + '5u5S6yWN5wJkEDr3hKeqF3Y8nWcyWaZDboEnpfUuAw1zcvbvevs58rEfCpN6VkfxaS4N8RCMkBcyhxBFs3eoL4U4', + '2bWLiRSA8GCh7UNEpiZdgsh2BMxZwKawk8ND4Z3iWrqDZE6JQk69n9WoCU9rKDrgWHw6qV25g8UBMJYddRJRHR9v' + ] + assertions: + - result:status_code = 200 + diff --git a/models/deploy/marketplace/helius/helius_das__helius_utils.yml b/models/deploy/marketplace/helius/helius_das__helius_utils.yml new file mode 100644 index 0000000..7a2b1ff --- /dev/null +++ b/models/deploy/marketplace/helius/helius_das__helius_utils.yml @@ -0,0 +1,114 @@ +version: 2 +models: + - name: helius_das__helius_utils + columns: + - name: get_asset + tests: + - test_udf: + name: test_helius_das__get_asset_status_200 + args: > + 'mainnet' + , { + 'id': 'F9Lw3ki3hJ7PF9HQXsBzoY8GyE6sPoEZZdXJBsTTD2rk' + } + assertions: + - result:status_code = 200 + + - name: get_signatures_for_asset + tests: + - test_udf: + name: test_helius_das__get_signatures_for_asset_status_200 + args: > + 'mainnet' + , { + 'id': 'FNt6A9Mfnqbwc1tY7uwAguKQ1JcpBrxmhczDgbdJy5AC', + 'page': 1, -- Starts at 1 + 'limit': 1000 -- Limit 1000 per request. + } + assertions: + - result:status_code = 200 + + - name: search_assets + tests: + - test_udf: + name: test_helius_das__search_assets_status_200 + args: > + 'mainnet' + , { + 'ownerAddress': '2k5AXX4guW9XwRQ1AKCpAuUqgWDpQpwFfpVFh3hnm2Ha', + 'compressed': true, + 'page': 1, -- Starts at 1 + 'limit': 1000 + } + assertions: + - result:status_code = 200 + + - name: get_asset_proof + tests: + - test_udf: + name: test_helius_das__get_asset_proof_status_200 + args: > + 'mainnet' + , { + 'id': 'Bu1DEKeawy7txbnCEJE4BU3BKLXaNAKCYcHR4XhndGss' + } + assertions: + - result:status_code = 200 + + - name: get_assets_by_owner + tests: + - test_udf: + name: test_helius_das__get_assets_by_owner_status_200 + args: > + 'mainnet' + , { + 'ownerAddress': '86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY', + 'page': 1, -- Starts at 1 + 'limit': 1000 + } + assertions: + - result:status_code = 200 + + - name: get_assets_by_authority + tests: + - test_udf: + name: test_helius_das__get_assets_by_authority_status_200 + args: > + 'mainnet' + , { + 'authorityAddress': '2RtGg6fsFiiF1EQzHqbd66AhW7R5bWeQGpTbv2UMkCdW', + 'page': 1, -- Starts at 1 + 'limit': 1000 + } + assertions: + - result:status_code = 200 + + - name: get_assets_by_creator + tests: + - test_udf: + name: test_helius_das__get_assets_by_creator_status_200 + args: > + 'mainnet' + , { + 'creatorAddress': 'D3XrkNZz6wx6cofot7Zohsf2KSsu2ArngNk8VqU9cTY3', + 'onlyVerified': true, + 'page': 1, -- Starts at 1 + 'limit': 1000 + } + assertions: + - result:status_code = 200 + + - name: get_assets_by_group + tests: + - test_udf: + name: test_helius_das__get_assets_by_group_status_200 + args: > + 'mainnet' + , { + 'groupKey': 'collection', + 'groupValue': 'J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w', + 'page': 1, + 'limit': 1000 + } + assertions: + - result:status_code = 200 diff --git a/models/deploy/marketplace/helius/helius_utils__helius_utils.sql b/models/deploy/marketplace/helius/helius_utils__helius_utils.sql index c237bd1..b87e3a9 100644 --- a/models/deploy/marketplace/helius/helius_utils__helius_utils.sql +++ b/models/deploy/marketplace/helius/helius_utils__helius_utils.sql @@ -1,5 +1,5 @@ -- depends_on: {{ ref('live') }} {%- set configs = [ - config_helius_util_udfs, + config_helius_utils_udfs, ] -%} {{- ephemeral_deploy_marketplace(configs) -}} \ No newline at end of file diff --git a/models/deploy/marketplace/playgrounds/playgrounds__.yml b/models/deploy/marketplace/playgrounds/playgrounds__.yml new file mode 100644 index 0000000..c4438d0 --- /dev/null +++ b/models/deploy/marketplace/playgrounds/playgrounds__.yml @@ -0,0 +1,44 @@ +version: 2 +models: + - name: playgrounds__ + columns: + - name: query_subgraph + tests: + - test_udf: + name: test_playgrounds__query_subgraph_status_200_liquidity_pools + args: > + 'ELUcwgpm14LKPLrBRuVvPvNKHQ9HvwmtKgKSH6123cr7' + , { + 'query': '{ + liquidityPools(first: 200, orderBy: totalValueLockedUSD, orderDirection: desc) { + id + totalLiquidity + name + inputTokens { + id + symbol + } + } + }', + 'variables': {} + } + assertions: + - result:status_code = 200 + + - test_udf: + name: test_playgrounds__query_subgraph_status_200_total_pool_count + args: > + 'ELUcwgpm14LKPLrBRuVvPvNKHQ9HvwmtKgKSH6123cr7' + , { + 'query': '{ + protocols { + name + totalPoolCount + } + }', + 'variables': {} + } + assertions: + - result:status_code = 200 + + diff --git a/models/deploy/marketplace/quicknode/quicknode_ethereum_nfts__quicknode_utils.sql b/models/deploy/marketplace/quicknode/quicknode_ethereum_nfts__quicknode_utils.sql index 717225e..f6abb50 100644 --- a/models/deploy/marketplace/quicknode/quicknode_ethereum_nfts__quicknode_utils.sql +++ b/models/deploy/marketplace/quicknode/quicknode_ethereum_nfts__quicknode_utils.sql @@ -1,6 +1,6 @@ -- depends_on: {{ ref('live') }} {%- set configs = [ - config_quicknode_ethereum_nft_udfs, + config_quicknode_ethereum_nfts_udfs, ] -%} {{- ephemeral_deploy_marketplace(configs) -}} --- depends_on: {{ ref('quicknode_utils__qicknode_utils') }} +-- depends_on: {{ ref('quicknode_utils__quicknode_utils') }} diff --git a/models/deploy/marketplace/quicknode/quicknode_ethereum_nfts__quicknode_utils.yml b/models/deploy/marketplace/quicknode/quicknode_ethereum_nfts__quicknode_utils.yml new file mode 100644 index 0000000..8740e0f --- /dev/null +++ b/models/deploy/marketplace/quicknode/quicknode_ethereum_nfts__quicknode_utils.yml @@ -0,0 +1,84 @@ +version: 2 +models: + - name: quicknode_ethereum_nfts__quicknode_utils + columns: + - name: fetch_nft_collection_details + tests: + - test_udf: + name: test_quicknode_ethereum_nfts__fetch_nft_collection_details_status_200 + args: > + { + 'contracts': [ + '0x60E4d786628Fea6478F785A6d7e704777c86a7c6', + '0x7Bd29408f11D2bFC23c34f18275bBf23bB716Bc7' + ] + } + assertions: + - result:status_code = 200 + + - name: fetch_nfts + tests: + - test_udf: + name: test_quicknode_ethereum_nfts__fetch_nfts_status_200 + args: > + { + 'wallet': '0x91b51c173a4bdaa1a60e234fc3f705a16d228740', + 'omitFields': [ + 'provenance', + 'traits' + ], + 'page': 1, + 'perPage': 10, + 'contracts': [ + '0x2106c00ac7da0a3430ae667879139e832307aeaa', + '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D' + ] + } + assertions: + - result:status_code = 200 + + - name: fetch_nfts_by_collection + tests: + - test_udf: + name: test_quicknode_ethereum_nfts__fetch_nfts_by_collection_status_200 + args: > + { + 'collection': '0x60E4d786628Fea6478F785A6d7e704777c86a7c6', + 'omitFields': [ + 'imageUrl', + 'traits' + ], + 'page': 1, + 'perPage': 10 + } + assertions: + - result:status_code = 200 + + - name: get_transfers_by_nft + tests: + - test_udf: + name: test_quicknode_ethereum_nfts__get_transfers_by_nft_status_200 + args: > + { + 'collection': '0x60E4d786628Fea6478F785A6d7e704777c86a7c6', + 'collectionTokenId': '1', + 'page': 1, + 'perPage': 10 + } + assertions: + - result:status_code = 200 + + - name: verify_nfts_owner + tests: + - test_udf: + name: test_quicknode_ethereum_nfts__verify_nfts_owner_status_200 + args: > + { + 'wallet': '0x91b51c173a4bdaa1a60e234fc3f705a16d228740', + 'contracts': [ + '0x2106c00ac7da0a3430ae667879139e832307aeaa:3643', + '0xd07dc4262bcdbf85190c01c996b4c06a461d2430:133803' + ] + } + assertions: + - result:status_code = 200 diff --git a/models/deploy/marketplace/quicknode/quicknode_ethereum_tokens__quicknode_utils.sql b/models/deploy/marketplace/quicknode/quicknode_ethereum_tokens__quicknode_utils.sql index 1880943..d46a6d1 100644 --- a/models/deploy/marketplace/quicknode/quicknode_ethereum_tokens__quicknode_utils.sql +++ b/models/deploy/marketplace/quicknode/quicknode_ethereum_tokens__quicknode_utils.sql @@ -1,6 +1,6 @@ -- depends_on: {{ ref('live') }} {%- set configs = [ - config_quicknode_ethereum_token_udfs, + config_quicknode_ethereum_tokens_udfs, ] -%} {{- ephemeral_deploy_marketplace(configs) -}} --- depends_on: {{ ref('quicknode_utils__qicknode_utils') }} +-- depends_on: {{ ref('quicknode_utils__quicknode_utils') }} diff --git a/models/deploy/marketplace/quicknode/quicknode_ethereum_tokens__quicknode_utils.yml b/models/deploy/marketplace/quicknode/quicknode_ethereum_tokens__quicknode_utils.yml new file mode 100644 index 0000000..dd9c739 --- /dev/null +++ b/models/deploy/marketplace/quicknode/quicknode_ethereum_tokens__quicknode_utils.yml @@ -0,0 +1,63 @@ +version: 2 +models: + - name: quicknode_ethereum_tokens__quicknode_utils + columns: + - name: get_token_metadata_by_contract_address + tests: + - test_udf: + name: test_quicknode_ethereum_tokens__get_token_metadata_by_contract_address_status_200 + args: > + { + 'contract': '0x4d224452801ACEd8B2F0aebE155379bb5D594381' + } + assertions: + - result:status_code = 200 + + - name: get_token_metadata_by_symbol + tests: + - test_udf: + name: test_quicknode_ethereum_tokens__get_token_metadata_by_symbol_status_200 + args: > + { + 'symbol': 'USDC' + } + assertions: + - result:status_code = 200 + + - name: get_transactions_by_address + tests: + - test_udf: + name: test_quicknode_ethereum_tokens__get_transactions_by_address_status_200 + args: > + { + 'address': '0xd8da6bf26964af9d7eed9e03e53415d37aa96045', + 'page': 1, + 'perPage': 10 + } + assertions: + - result:status_code = 200 + + - name: get_wallet_token_balance + tests: + - test_udf: + name: test_quicknode_ethereum_tokens__get_wallet_token_balance_status_200 + args: > + { + 'wallet': '0xd8da6bf26964af9d7eed9e03e53415d37aa96045' + } + assertions: + - result:status_code = 200 + + - name: get_wallet_token_transactions + tests: + - test_udf: + name: test_quicknode_ethereum_tokens__get_wallet_token_transactions_status_200 + args: > + { + 'address': '0xd8da6bf26964af9d7eed9e03e53415d37aa96045', + 'contract': '0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE', + 'page': 1, + 'perPage': 10 + } + assertions: + - result:status_code = 200 diff --git a/models/deploy/marketplace/quicknode/quicknode_polygon_nfts__quicknode_utils.sql b/models/deploy/marketplace/quicknode/quicknode_polygon_nfts__quicknode_utils.sql index 8eaf830..5a93a21 100644 --- a/models/deploy/marketplace/quicknode/quicknode_polygon_nfts__quicknode_utils.sql +++ b/models/deploy/marketplace/quicknode/quicknode_polygon_nfts__quicknode_utils.sql @@ -1,6 +1,6 @@ -- depends_on: {{ ref('live') }} {%- set configs = [ - config_quicknode_polygon_nft_udfs, + config_quicknode_polygon_nfts_udfs, ] -%} {{- ephemeral_deploy_marketplace(configs) -}} --- depends_on: {{ ref('quicknode_utils__qicknode_utils') }} +-- depends_on: {{ ref('quicknode_utils__quicknode_utils') }} diff --git a/models/deploy/marketplace/quicknode/quicknode_polygon_nfts__quicknode_utils.yml b/models/deploy/marketplace/quicknode/quicknode_polygon_nfts__quicknode_utils.yml new file mode 100644 index 0000000..1bdb749 --- /dev/null +++ b/models/deploy/marketplace/quicknode/quicknode_polygon_nfts__quicknode_utils.yml @@ -0,0 +1,85 @@ +version: 2 +models: + - name: quicknode_polygon_nfts__quicknode_utils + columns: + - name: fetch_nft_collection_details + tests: + - test_udf: + name: test_quicknode_polygon_nfts__fetch_nft_collection_details_status_200 + args: > + { + 'contracts': [ + '0x60E4d786628Fea6478F785A6d7e704777c86a7c6', + '0x7Bd29408f11D2bFC23c34f18275bBf23bB716Bc7' + ] + } + assertions: + - result:status_code = 200 + + - name: fetch_nfts + tests: + - test_udf: + name: test_quicknode_polygon_nfts__fetch_nfts_status_200 + args: > + { + 'wallet': '0x91b51c173a4bdaa1a60e234fc3f705a16d228740', + 'omitFields': [ + 'provenance', + 'traits' + ], + 'page': 1, + 'perPage': 10, + 'contracts': [ + '0x2106c00ac7da0a3430ae667879139e832307aeaa', + '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D' + ] + } + assertions: + - result:status_code = 200 + + - name: fetch_nfts_by_collection + tests: + - test_udf: + name: test_quicknode_polygon_nfts__fetch_nfts_by_collection_status_200 + args: > + { + 'collection': '0x60E4d786628Fea6478F785A6d7e704777c86a7c6', + 'omitFields': [ + 'imageUrl', + 'traits' + ], + 'page': 1, + 'perPage': 10 + } + assertions: + - result:status_code = 200 + + - name: get_transfers_by_nft + tests: + - test_udf: + name: test_quicknode_polygon_nfts__get_transfers_by_nft_status_200 + args: > + { + 'collection': '0x60E4d786628Fea6478F785A6d7e704777c86a7c6', + 'collectionTokenId': '1', + 'page': 1, + 'perPage': 10 + } + assertions: + - result:status_code = 200 + + - name: verify_nfts_owner + tests: + - test_udf: + name: test_quicknode_polygon_nfts__verify_nfts_owner_status_200 + args: > + { + 'wallet': '0x91b51c173a4bdaa1a60e234fc3f705a16d228740', + 'contracts': [ + '0x2106c00ac7da0a3430ae667879139e832307aeaa:3643', + '0xd07dc4262bcdbf85190c01c996b4c06a461d2430:133803' + ] + } + assertions: + - result:status_code = 200 + diff --git a/models/deploy/marketplace/quicknode/quicknode_polygon_tokens__quicknode_utils.sql b/models/deploy/marketplace/quicknode/quicknode_polygon_tokens__quicknode_utils.sql index 32881e8..7d37f60 100644 --- a/models/deploy/marketplace/quicknode/quicknode_polygon_tokens__quicknode_utils.sql +++ b/models/deploy/marketplace/quicknode/quicknode_polygon_tokens__quicknode_utils.sql @@ -1,6 +1,6 @@ -- depends_on: {{ ref('live') }} {%- set configs = [ - config_quicknode_polygon_token_udfs, + config_quicknode_polygon_tokens_udfs, ] -%} {{- ephemeral_deploy_marketplace(configs) -}} --- depends_on: {{ ref('quicknode_utils__qicknode_utils') }} +-- depends_on: {{ ref('quicknode_utils__quicknode_utils') }} diff --git a/models/deploy/marketplace/quicknode/quicknode_polygon_tokens__quicknode_utils.yml b/models/deploy/marketplace/quicknode/quicknode_polygon_tokens__quicknode_utils.yml new file mode 100644 index 0000000..ebe5595 --- /dev/null +++ b/models/deploy/marketplace/quicknode/quicknode_polygon_tokens__quicknode_utils.yml @@ -0,0 +1,63 @@ +version: 2 +models: + - name: quicknode_polygon_tokens__quicknode_utils + columns: + - name: get_token_metadata_by_contract_address + tests: + - test_udf: + name: test_quicknode_polygon_tokens__get_token_metadata_by_contract_address_status_200 + args: > + { + 'contract': '0x4d224452801ACEd8B2F0aebE155379bb5D594381' + } + assertions: + - result:status_code = 200 + + - name: get_token_metadata_by_symbol + tests: + - test_udf: + name: test_quicknode_polygon_tokens__get_token_metadata_by_symbol_status_200 + args: > + { + 'symbol': 'USDC' + } + assertions: + - result:status_code = 200 + + - name: get_transactions_by_address + tests: + - test_udf: + name: test_quicknode_polygon_tokens__get_transactions_by_address_status_200 + args: > + { + 'address': '0xd8da6bf26964af9d7eed9e03e53415d37aa96045', + 'page': 1, + 'perPage': 10 + } + assertions: + - result:status_code = 200 + + - name: get_wallet_token_balance + tests: + - test_udf: + name: test_quicknode_polygon_tokens__get_wallet_token_balance_status_200 + args: > + { + 'wallet': '0xd8da6bf26964af9d7eed9e03e53415d37aa96045' + } + assertions: + - result:status_code = 200 + + - name: get_wallet_token_transactions + tests: + - test_udf: + name: test_quicknode_polygon_tokens__get_wallet_token_transactions_status_200 + args: > + { + 'address': '0xd8da6bf26964af9d7eed9e03e53415d37aa96045', + 'contract': '0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE', + 'page': 1, + 'perPage': 10 + } + assertions: + - result:status_code = 200 diff --git a/models/deploy/marketplace/quicknode/quicknode_solana_nfts__quicknode_utils.sql b/models/deploy/marketplace/quicknode/quicknode_solana_nfts__quicknode_utils.sql index d0747eb..65220d1 100644 --- a/models/deploy/marketplace/quicknode/quicknode_solana_nfts__quicknode_utils.sql +++ b/models/deploy/marketplace/quicknode/quicknode_solana_nfts__quicknode_utils.sql @@ -1,6 +1,6 @@ -- depends_on: {{ ref('live') }} {%- set configs = [ - config_quicknode_solana_nft_udfs, + config_quicknode_solana_nfts_udfs, ] -%} {{- ephemeral_deploy_marketplace(configs) -}} --- depends_on: {{ ref('quicknode_utils__qicknode_utils') }} +-- depends_on: {{ ref('quicknode_utils__quicknode_utils') }} diff --git a/models/deploy/marketplace/quicknode/quicknode_solana_nfts__quicknode_utils.yml b/models/deploy/marketplace/quicknode/quicknode_solana_nfts__quicknode_utils.yml new file mode 100644 index 0000000..afa752d --- /dev/null +++ b/models/deploy/marketplace/quicknode/quicknode_solana_nfts__quicknode_utils.yml @@ -0,0 +1,34 @@ +version: 2 +models: + - name: quicknode_solana_nfts__quicknode_utils + columns: + - name: fetch_nfts + tests: + - test_udf: + name: test_quicknode_solana_nfts__fetch_nfts_status_200 + args: > + { + 'wallet': 'DcTmx4VLcf5euAB17nynax7g55xuB3XKBDyz1pudMcjW', + 'omitFields': [ + 'provenance', + 'traits' + ], + 'page': 1, + 'perPage': 10 + } + assertions: + - result:status_code = 200 + + - name: fetch_nfts_by_creator + tests: + - test_udf: + name: test_quicknode_solana_nfts__fetch_nfts_by_creator_status_200 + args: > + { + 'creator': 'DznU28LgherhU2JwC2db3KmAeWPqoF9Yx2aVtNUudW6R', + 'page': 1, + 'perPage': 3 + } + assertions: + - result:status_code = 200 + diff --git a/models/deploy/marketplace/quicknode/quicknode_utils__qicknode_utils.sql b/models/deploy/marketplace/quicknode/quicknode_utils__quicknode_utils.sql similarity index 76% rename from models/deploy/marketplace/quicknode/quicknode_utils__qicknode_utils.sql rename to models/deploy/marketplace/quicknode/quicknode_utils__quicknode_utils.sql index dcfffdc..1a57ba5 100644 --- a/models/deploy/marketplace/quicknode/quicknode_utils__qicknode_utils.sql +++ b/models/deploy/marketplace/quicknode/quicknode_utils__quicknode_utils.sql @@ -1,5 +1,5 @@ -- depends_on: {{ ref('live') }} {%- set configs = [ - config_quicknode_util_udfs, + config_quicknode_utils_udfs, ] -%} {{- ephemeral_deploy_marketplace(configs) -}} diff --git a/models/deploy/marketplace/strangelove/strangelove__.yml b/models/deploy/marketplace/strangelove/strangelove__.yml new file mode 100644 index 0000000..1e772ec --- /dev/null +++ b/models/deploy/marketplace/strangelove/strangelove__.yml @@ -0,0 +1,15 @@ +version: 2 +models: + - name: strangelove__ + columns: + - name: get + tests: + - test_udf: + name: test_strangelove__get_status_200 + args: > + 'https://api.strange.love/cosmoshub/mainnet/rpc/block_by_hash' + , { + 'blockHash': '0xD70952032620CC4E2737EB8AC379806359D8E0B17B0488F627997A0B043ABDED' + } + assertions: + - result:status_code = 200 diff --git a/models/deploy/marketplace/subquery/subquery__.sql b/models/deploy/marketplace/subquery/subquery__.sql index 58419d3..76eea68 100644 --- a/models/deploy/marketplace/subquery/subquery__.sql +++ b/models/deploy/marketplace/subquery/subquery__.sql @@ -2,4 +2,4 @@ {%- set configs = [ config_subquery_udfs ] -%} -{{- ephemeral_deploy_marketplace(configs) -}} \ No newline at end of file +{{- ephemeral_deploy_marketplace(configs) -}} diff --git a/models/deploy/marketplace/subquery/subquery__.yml b/models/deploy/marketplace/subquery/subquery__.yml new file mode 100644 index 0000000..5062cf6 --- /dev/null +++ b/models/deploy/marketplace/subquery/subquery__.yml @@ -0,0 +1,13 @@ +version: 2 +models: + - name: subquery__ + columns: + - name: graphql + tests: + - test_udf: + name: test_subquery__graphql_status_200 + args: > + 'kepler-network' + , {'query':'query { _mmrs (first: 5) { nodes { key } } }'} + assertions: + - result:status_code = 200 diff --git a/tests/generic/test_udf.sql b/tests/generic/test_udf.sql index 6024f72..407abca 100644 --- a/tests/generic/test_udf.sql +++ b/tests/generic/test_udf.sql @@ -1,17 +1,12 @@ -{% test test_udf(model, column_name, args, expected) %} -{%- set schema = model | replace("__dbt__cte__", "") -%} -{%- set udf = schema ~ "." ~ column_name -%} -, -tests AS -( - SELECT - '{{ udf }}' AS test_name - ,[{{ args }}] as parameters - ,{{ udf }}({{args}}) AS actual - ,{{ expected }} AS expected - ,NOT {{ udf }}({{args}}) = {{ expected }} AS failed -) -SELECT * -FROM tests -WHERE FAILED = TRUE +{% test test_udf(model, column_name, args, assertions) %} + {# + This is a generic test for UDFs. + The udfs are deployed using ephemeral models, so we need to + use the ephemeral model name to get the udf name. + #} + {%- set schema = model | replace("__dbt__cte__", "") -%} + {%- set schema = schema.split("__") | first -%} + {%- set udf = schema ~ "." ~ column_name -%} + + {{ base_test_udf(model, udf, args, assertions) }} {% endtest %} \ No newline at end of file