-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add checking macros #92
Conversation
Signed-off-by: Yu Ishikawa <yu-iskw@users.noreply.github.com>
WalkthroughA series of new macros have been introduced to enhance testing capabilities in the integration tests. These macros include Changes
Poem
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 9
🧹 Outside diff range and nitpick comments (52)
macros/comparisons/is_none.sql (1)
1-3
: LGTM! Clean and focused implementation.The macro implementation is correct and follows SQL best practices with a clear, single responsibility.
Consider adding a documentation comment to explain the macro's purpose and usage:
+{# + Returns true if the provided value is None, false otherwise. + + Args: + value: The value to check + Returns: + boolean: True if the value is None, false otherwise +#} {% macro is_none(value) %} {{ return(value is none) }} {% endmacro %}macros/comparisons/is_not_none.sql (1)
1-1
: Consider adding macro documentation.Adding a documentation block would help users understand:
- The purpose of the macro
- The expected parameter type
- The return value type and possible values
+{# + Returns whether the provided value is not none/null + Args: + value: The value to check + Returns: + boolean: True if the value is not none, False otherwise +#} {% macro is_not_none(value) %}macros/comparisons/equals.sql (1)
1-3
: LGTM! Consider adding documentation and NULL handling.The macro implementation is clean and straightforward. However, consider these improvements:
- Add macro documentation with usage examples and parameter descriptions
- Consider handling NULL values explicitly, as SQL NULL comparisons can be tricky
Here's a suggested enhancement:
+{# + Checks if two values are equal using SQL equality comparison. + + Args: + actual: The actual value to compare + expected: The expected value to compare against + + Returns: + Boolean: True if values are equal, False otherwise + + Example: + {% if dbt_unittest.equals(column_name, 'expected_value') %} + -- do something + {% endif %} + #} {% macro equals(actual, expected) %} - {{ return(actual == expected) }} + {{ return( + case + when actual is null and expected is null then true + when actual is null or expected is null then false + else actual == expected + end + ) }} {% endmacro %}macros/comparisons/not_equals.sql (2)
1-3
: Add documentation and examples for the macro.While the implementation is clean and straightforward, adding documentation would improve usability. Consider adding:
- Parameter types and constraints
- Return value description
- Usage examples
- Null handling behavior
Add documentation using Jinja comments:
+{# + Compares two values for inequality. + + Args: + actual: The actual value to compare + unexpected: The value that actual should not equal + + Returns: + boolean: True if values are not equal, False otherwise + + Example: + {%- if not_equals(column_name, 'invalid_value') %} + -- handle non-matching case + {%- endif %} +#} {% macro not_equals(actual, unexpected) %} {{ return(actual != unexpected) }} {% endmacro %}
2-2
: Consider explicit null handling.In SQL, comparing NULL values with
!=
can lead to unexpected results as NULL comparisons typically return NULL rather than true/false.Consider adding explicit NULL handling:
- {{ return(actual != unexpected) }} + {{ return(actual is distinct from unexpected) }}This ensures consistent behavior with NULL values while maintaining the same functionality for non-NULL values.
macros/comparisons/is_true.sql (2)
1-3
: The implementation is functionally correct but could be more robust.The macro correctly evaluates true conditions using both equality and identity checks, which is good for compatibility.
Consider adding explicit NULL handling to prevent unexpected behavior in edge cases:
{% macro is_true(condition) %} - {{ return(condition == true or condition is true) }} + {{ return(condition is not none and (condition == true or condition is true)) }} {% endmacro %}
1-3
: Consider adding documentationAdding a docstring would help users understand the macro's purpose and behavior.
{% macro is_true(condition) %} + {# + Returns true if the condition evaluates to true. + + Args: + condition: The boolean condition to evaluate + + Returns: + bool: True if condition is true, False otherwise + #} {{ return(condition == true or condition is true) }} {% endmacro %}macros/comparisons/is_false.sql (1)
1-3
: Add documentation for the macroWhile the implementation is correct, please add documentation to explain:
- Purpose of the macro
- Parameter description
- Return value description
- Example usage
Here's a suggested documentation format:
+{# + Returns true if the condition evaluates to false. + + Args: + condition: The condition to evaluate + + Returns: + Boolean: True if condition is false, false otherwise + + Example: + {% if is_false(column_value) %} + -- handle false case + {% endif %} +#} {% macro is_false(condition) %} {{ return(condition == false or condition is false) }} {% endmacro %}macros/assert_is_none.sql (1)
2-3
: Consider enhancing the error message with the actual valueThe error message could be more helpful for debugging by including the actual value that was received.
- {% do exceptions.raise_compiler_error("FAILED: Value is not None.") %} + {% do exceptions.raise_compiler_error("FAILED: Expected None but got '" ~ value ~ "'") %}macros/assert_is_not_none.sql (2)
3-3
: Consider enhancing the error message with more context.The current error message "FAILED: Value is None" could be more helpful for debugging by including information about the value being checked.
- {% do exceptions.raise_compiler_error("FAILED: Value is None.") %} + {% do exceptions.raise_compiler_error("FAILED: Expected value to be not None, but got None.") %}
1-5
: Consider adding macro documentation.Adding a docstring would help users understand:
- The purpose of the macro
- Expected input types
- Example usage
{% macro assert_is_not_none(value) %} + {# + Asserts that the given value is not None. + + Args: + value: The value to check + + Raises: + CompilerError: If the value is None + + Example: + {% do assert_is_not_none(my_value) %} + #} {% if not dbt_unittest.is_not_none(value) %}macros/assert_true.sql (2)
3-3
: Consider enhancing error message with more contextThe current error message "FAILED: Condition is not true." could be more helpful for debugging. Consider including:
- The actual value of the condition
- The location where the assertion failed
- {% do exceptions.raise_compiler_error("FAILED: Condition is not true.") %} + {% do exceptions.raise_compiler_error("FAILED: Condition is not true. Got: " ~ condition ~ " at " ~ this.name) %}
1-5
: Add macro documentationConsider adding a docstring to explain:
- The purpose of the macro
- Parameter description
- Example usage
- Breaking changes from previous version
+{# + Assert that a condition is true. + + Args: + condition: The boolean condition to evaluate + + Raises: + CompilerError: If the condition evaluates to false + + Example: + {% do dbt_unittest.assert_true(1 == 1) %} +#} {% macro assert_true(condition) %}macros/assert_false.sql (1)
2-3
: Consider enhancing the error message with actual value.While the current implementation is correct, the error message could be more helpful for debugging by including the actual value that failed the assertion.
- {% do exceptions.raise_compiler_error("FAILED: Condition is not false.") %} + {% do exceptions.raise_compiler_error("FAILED: Expected condition to be false, but got " ~ condition ~ ".") %}macros/assert_list_equals.sql (1)
3-3
: Enhance error message with detailsThe current error message "Lists are not equal" provides minimal debugging information. Including the actual values and their differences would make troubleshooting easier.
Consider enhancing the error message:
- {% do exceptions.raise_compiler_error("FAILED: Lists are not equal.") %} + {% do exceptions.raise_compiler_error(" + FAILED: Lists are not equal. + Expected: " ~ expected ~ " + Actual: " ~ actual + ") %}macros/assert_dict_equals.sql (1)
2-3
: Enhance error message with actual values.While the implementation is clean, the error message could be more helpful for debugging by including the actual and expected values.
Consider this improvement:
{% if not dbt_unittest.dict_equals(actual, expected) %} - {% do exceptions.raise_compiler_error("FAILED: Dictionaries are not equal.") %} + {% do exceptions.raise_compiler_error("FAILED: Dictionaries are not equal. Expected " ~ expected ~ " but got " ~ actual) %} {% endif %}macros/assert_equals.sql (1)
2-3
: Consider enhancing error message formatting.While the current error message is functional, consider using a more structured format for better readability in test outputs.
- {% do exceptions.raise_compiler_error("FAILED: " ~ actual ~ " does not equal " ~ expected ~ ".") %} + {% do exceptions.raise_compiler_error("Assertion Failed + Expected: " ~ expected ~ " + Actual: " ~ actual) %}macros/assert_not_equals.sql (1)
2-3
: Consider enhancing the error message format.While the current error message is functional, it could be more readable with proper formatting.
- {% do exceptions.raise_compiler_error("FAILED: " ~ actual ~ " should not equal " ~ unexpected ~ ".") %} + {% do exceptions.raise_compiler_error("FAILED: Expected '" ~ actual ~ "' to not equal '" ~ unexpected ~ "'") %}The suggested format:
- Adds quotes around values for better visibility
- Removes trailing period for consistency with common assertion messages
- Uses more natural language structure
macros/comparisons/in.sql (2)
1-3
: Add macro documentation with parameter types and examples.Consider adding a documentation block to describe:
- Parameter types and constraints
- Return value
- Usage examples for different types
+{# + Checks if a value is present in the expected collection/value. + Args: + value: The value to search for + expected: The collection or value to search in (can be mapping, iterable, string, or single value) + Returns: + boolean: True if value is found in expected, False otherwise + Example: + {% set result = dbt_unittest.in('a', ['a', 'b']) %} -- returns true + {% set result = dbt_unittest.in('key', {'key': 'value'}) %} -- returns true + {% set result = dbt_unittest.in('bc', 'abc') %} -- returns true +#} {% macro in(value, expected) %}
1-16
: Consider enhancing error reporting capabilities.As this is part of a testing framework, consider these enhancements:
- Add detailed error messages for type mismatches
- Integrate with a centralized test reporting mechanism
- Add support for custom equality comparators for complex types
This would make the testing framework more robust and maintainable.
macros/comparisons/not_in.sql (3)
1-3
: Add parameter documentation and type validationConsider adding documentation for the expected parameter types and adding validation for edge cases (null values, empty collections).
+{# Checks if a value is not present in the expected collection/value + Args: + value: The value to check for + expected: The collection or value to check against (can be mapping, iterable, string, or single value) + Returns: + bool: True if value is not in expected, False otherwise +#} {% macro not_in(value, expected) %} + {# Handle null values #} + {% if expected is none %} + {{ return(true if value is not none else false) }} + {% endif %} + {% set is_not_in = true %}
8-11
: Consolidate duplicate conditionsThe handling for iterables and strings can be combined since they use the same operation.
- {% elif expected is iterable and expected is not string %} - {% set is_not_in = value not in expected %} - {% elif expected is string %} - {% set is_not_in = value not in expected %} + {% elif expected is iterable %} + {% set is_not_in = value not in expected %}
1-16
: Consider enhancing error reporting capabilitiesAs this is part of a testing framework, consider adding detailed error messages when comparisons fail. This would make debugging failed tests easier.
{% macro not_in(value, expected) %} {% set is_not_in = true %} + {% set error_message = none %} {# Handle different types of collections #} {% if expected is mapping %} {% set is_not_in = value not in expected.keys() %} + {% if not is_not_in %} + {% set error_message = "Expected " ~ value ~ " to not be in keys: " ~ expected.keys() %} + {% endif %} {% elif expected is iterable and expected is not string %} {% set is_not_in = value not in expected %} + {% if not is_not_in %} + {% set error_message = "Expected " ~ value ~ " to not be in: " ~ expected %} + {% endif %} ... - {{ return(is_not_in) }} + {{ return({'result': is_not_in, 'error': error_message}) }}integration_tests/macros/tests/test_macros.sql (1)
13-20
: LGTM! Consider enhancing documentation.The new comparison macro tests follow a consistent naming convention and are well-organized. However, since this represents a significant change in testing approach:
- Consider adding a docstring explaining the new testing philosophy
- Link to the implementation files mentioned in the separate comparison files
Add a docstring like this:
{# New comparison macro unit tests #} +{# + These tests validate the new comparison macros implemented in: + - test_equals.sql + - test_not_equals.sql + - test_is_true.sql + - test_is_false.sql + - test_in.sql + - test_not_in.sql + - test_dict_equals.sql +#} {% do test_equals() %}integration_tests/macros/tests/comparisons/test_equals.sql (2)
1-1
: Add macro documentation.Consider adding a docstring to describe the purpose of the macro, its test cases, and expected behavior.
{% macro test_equals() %} + {# + Tests the dbt_unittest.equals function with various scenarios: + - Integer equality (positive case) + - Integer inequality (negative case) + - String equality (positive case) + - String inequality (negative case) + #}
2-6
: Consider adding edge cases for integer equality.While the basic test is good, consider adding edge cases such as:
- Zero equality (0 == 0)
- Negative number equality (-5 == -5)
- Large number equality
integration_tests/macros/tests/comparisons/test_not_equals.sql (2)
2-12
: Enhance error messages with actual and expected values.While the tests are logically correct, the error messages could be more descriptive to aid in debugging.
Consider this improvement:
- {{ exceptions.raise_compiler_error("Failed: 5 should not equal 6") }} + {{ exceptions.raise_compiler_error("Expected values to be different. Got: 5, 6") }} - {{ exceptions.raise_compiler_error("Failed: 5 should equal 5") }} + {{ exceptions.raise_compiler_error("Expected values to be equal. Got: 5, 5") }}
14-24
: Apply consistent error message improvements to string tests.Similar to the integer tests, the string comparison error messages could be more descriptive.
Consider this improvement:
- {{ exceptions.raise_compiler_error("Failed: 'hello' should not equal 'world'") }} + {{ exceptions.raise_compiler_error("Expected strings to be different. Got: 'hello', 'world'") }} - {{ exceptions.raise_compiler_error("Failed: 'hello' should equal 'hello'") }} + {{ exceptions.raise_compiler_error("Expected strings to be equal. Got: 'hello', 'hello'") }}integration_tests/macros/tests/comparisons/test_is_true.sql (5)
1-1
: Add macro documentation.Consider adding a documentation block to describe the macro's purpose, usage, and expected behavior.
+{# + Macro to test the dbt_unittest.is_true function. + Tests both literal boolean values and boolean expressions. + + Example: + - dbt run-operation test_is_true +#} {% macro test_is_true() %}
2-6
: Consider standardizing test result handling.The test case is well-structured, but consider extracting the result checking pattern into a reusable assertion macro for consistency across all test cases.
{# Test successful true condition #} -{% set result1 = dbt_unittest.is_true(true) %} -{% if not result1 %} - {{ exceptions.raise_compiler_error("Failed: true should be true") }} -{% endif %} +{{ dbt_unittest.assert_true( + dbt_unittest.is_true(true), + "true should be true" + ) }}
8-12
: Apply consistent test pattern.Similar to the previous test case, consider using a standardized assertion pattern.
{# Test failed true condition #} -{% set result2 = dbt_unittest.is_true(false) %} -{% if result2 %} - {{ exceptions.raise_compiler_error("Failed: false should not be true") }} -{% endif %} +{{ dbt_unittest.assert_false( + dbt_unittest.is_true(false), + "false should not be true" + ) }}
14-19
: Consider variable scope isolation.The variable
x
is defined at the macro level. Consider using a more descriptive name or wrapping related tests in a context block to prevent potential naming conflicts.{# Test true with boolean expression #} -{% set x = 5 %} +{% set test_value = 5 %} -{% set result3 = dbt_unittest.is_true(x == 5) %} +{% set result3 = dbt_unittest.is_true(test_value == 5) %} {% if not result3 %} - {{ exceptions.raise_compiler_error("Failed: 5 == 5 should be true") }} + {{ exceptions.raise_compiler_error("Failed: test_value == 5 should be true") }} {% endif %}
21-25
: Apply consistent variable naming.Update the variable name to match the suggested change from the previous test case.
{# Test false with boolean expression #} -{% set result4 = dbt_unittest.is_true(x != 5) %} +{% set result4 = dbt_unittest.is_true(test_value != 5) %} {% if result4 %} - {{ exceptions.raise_compiler_error("Failed: 5 != 5 should not be true") }} + {{ exceptions.raise_compiler_error("Failed: test_value != 5 should not be true") }} {% endif %}integration_tests/macros/tests/comparisons/test_is_false.sql (4)
2-6
: Consider enhancing error messages with actual valuesWhile the test logic is correct, the error message could be more descriptive by including the actual value being tested.
- {{ exceptions.raise_compiler_error("Failed: false should be false") }} + {{ exceptions.raise_compiler_error("Failed: is_false(false) expected to return true") }}
8-12
: Consider enhancing error messages with actual valuesSimilar to the previous test case, the error message could be more descriptive.
- {{ exceptions.raise_compiler_error("Failed: true should not be false") }} + {{ exceptions.raise_compiler_error("Failed: is_false(true) expected to return false") }}
14-19
: Good test case with practical boolean expression!The test effectively demonstrates using
is_false
with boolean expressions. Consider making the error message more explicit about the expression being tested.- {{ exceptions.raise_compiler_error("Failed: 5 != 5 should be false") }} + {{ exceptions.raise_compiler_error("Failed: is_false(x != 5) expected to return true, where x = 5") }}
21-25
: Good complementary test case!This test case effectively complements the previous one by testing the opposite condition. Consider improving the error message for consistency.
- {{ exceptions.raise_compiler_error("Failed: 5 == 5 should not be false") }} + {{ exceptions.raise_compiler_error("Failed: is_false(x == 5) expected to return false, where x = 5") }}integration_tests/macros/tests/comparisons/test_in.sql (2)
1-1
: Add macro documentation.Consider adding a documentation block to describe the purpose of this macro, its test cases, and expected behavior.
+{# + Macro to test the dbt_unittest.in function. + Tests both list and string containment with positive and negative cases. + + Example: + - list containment: 5 in [1,2,3,4,5] + - string containment: 'a' in 'abcde' +#} {% macro test_in() %}
3-12
: Improve variable naming consistency.The variable names
result1
andresult2
could be more descriptive of their purpose.- {% set result1 = dbt_unittest.in(5, [1, 2, 3, 4, 5]) %} - {% if not result1 %} + {% set is_five_in_list = dbt_unittest.in(5, [1, 2, 3, 4, 5]) %} + {% if not is_five_in_list %} - {% set result2 = dbt_unittest.in(6, [1, 2, 3, 4, 5]) %} - {% if result2 %} + {% set is_six_in_list = dbt_unittest.in(6, [1, 2, 3, 4, 5]) %} + {% if is_six_in_list %}integration_tests/macros/tests/comparisons/test_is_none.sql (2)
1-7
: Add macro documentation for better maintainabilityConsider adding a docstring to describe the macro's purpose, parameters, and expected behavior. This will help other developers understand and maintain the test suite.
{% macro test_is_none() %} + {# + Tests the is_none comparison function from dbt_unittest. + + This macro validates that: + - is_none correctly identifies None values + - is_none correctly rejects non-None values + #} {# Test successful is_none condition #}
8-27
: Consider adding more edge casesThe current test suite covers basic data types well. However, consider adding tests for common edge cases that might be confused with None:
- Empty string ('')
- Empty collections ([], {})
- Zero (0)
- Undefined variables
{% if result5 %} {{ exceptions.raise_compiler_error("Failed: dictionary should not be None") }} {% endif %} + + {# Test empty values #} + {% set result6 = dbt_unittest.is_none('') %} + {% if result6 %} + {{ exceptions.raise_compiler_error("Failed: empty string should not be None") }} + {% endif %} + + {% set result7 = dbt_unittest.is_none([]) %} + {% if result7 %} + {{ exceptions.raise_compiler_error("Failed: empty list should not be None") }} + {% endif %} + + {% set result8 = dbt_unittest.is_none({}) %} + {% if result8 %} + {{ exceptions.raise_compiler_error("Failed: empty dict should not be None") }} + {% endif %} + + {% set result9 = dbt_unittest.is_none(0) %} + {% if result9 %} + {{ exceptions.raise_compiler_error("Failed: zero should not be None") }} + {% endif %}integration_tests/macros/tests/comparisons/test_not_in.sql (3)
2-6
: Consider enhancing error message with actual result.While the test case is well-implemented, the error message could be more helpful for debugging by including the actual result.
- {{ exceptions.raise_compiler_error("Failed: 6 should not be in [1, 2, 3, 4, 5]") }} + {{ exceptions.raise_compiler_error("Failed: 6 should not be in [1, 2, 3, 4, 5]. Got result: " ~ result1) }}
1-25
: Consider adding edge case tests.While the current test coverage is good, consider adding tests for:
- Empty list/string inputs
- None/null values
- Special characters in strings
- Lists with mixed types
Example addition:
{# Test edge cases #} {% set result5 = dbt_unittest.not_in('', '') %} {% set result6 = dbt_unittest.not_in(none, [1, 2, 3]) %} {% set result7 = dbt_unittest.not_in('$', 'test$string') %}
1-25
: Consider adding macro documentation.To improve maintainability and usability, consider adding:
- A macro description using dbt's documentation syntax
- Examples of usage in integration tests
- Expected behavior and error cases
Example documentation:
{# /* Macro to test the not_in comparison function. Tests both list and string containment with positive and negative cases. Raises compiler errors for failed assertions. Example: - dbt run-operation test_not_in */ #}macros/comparisons/dict_equals.sql (2)
1-10
: Consider combining None checks for better readability.The None handling logic is correct but could be more concise.
Consider this alternative:
{% macro dict_equals(actual, expected) %} - {# Handle None cases #} - {% if actual is none and expected is none %} - {{ return(true) }} - {% endif %} - - {# Check for None values #} - {% if actual is none or expected is none %} - {{ return(false) }} - {% endif %} + {# Handle None cases #} + {% if actual is none or expected is none %} + {{ return(actual is none and expected is none) }} + {% endif %}
12-15
: Enhance type checking documentation.While the type checking is correct, the comment could be more descriptive about what constitutes a mapping type in this context.
Consider updating the comment:
- {# Check for mapping types #} + {# Verify both inputs are dictionary-like mapping types #}integration_tests/macros/tests/comparisons/test_dict_equals.sql (6)
1-8
: Add macro documentation.Consider adding a docstring to describe the macro's purpose, parameters, and usage examples. This will help other developers understand how to use and maintain the test suite.
{% macro test_dict_equals() %} + {# + Tests the dbt_unittest.dict_equals function with various dictionary comparison scenarios. + + Returns: + None. Raises compiler error if any test case fails. + + Example: + {% do test_dict_equals() %} + #} {# Test successful dictionary equality #}
10-29
: Consider adding edge cases to dictionary comparison tests.The current tests cover basic scenarios well. Consider adding these edge cases:
- Dictionaries with unicode keys/values
- Dictionaries with special characters in keys
- Very large dictionaries to test performance
31-41
: Enhance type comparison tests.Consider adding tests for:
- Other sequence types (tuples, sets)
- Custom objects with
__dict__
attribute- Frozen dictionaries if supported in your environment
43-47
: Consider reorganizing None-related tests.Group all None-related tests together for better organization:
- None vs None equality
- None vs dictionary comparison
- None vs empty dictionary
49-62
: Expand nested dictionary test cases.Consider adding tests for:
- Deeply nested dictionaries (3+ levels)
- Nested dictionaries with mixed types at different levels
- Circular references (if supported)
1-86
: Consider test framework improvements.The test implementation is solid, but consider these architectural improvements:
- Extract common test data into fixture macros for reuse
- Add a test result summary at the end of execution
- Consider parameterized tests to reduce code duplication
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (28)
integration_tests/macros/tests/comparisons/test_dict_equals.sql
(1 hunks)integration_tests/macros/tests/comparisons/test_equals.sql
(1 hunks)integration_tests/macros/tests/comparisons/test_in.sql
(1 hunks)integration_tests/macros/tests/comparisons/test_is_false.sql
(1 hunks)integration_tests/macros/tests/comparisons/test_is_none.sql
(1 hunks)integration_tests/macros/tests/comparisons/test_is_true.sql
(1 hunks)integration_tests/macros/tests/comparisons/test_not_equals.sql
(1 hunks)integration_tests/macros/tests/comparisons/test_not_in.sql
(1 hunks)integration_tests/macros/tests/test_macros.sql
(1 hunks)macros/assert_dict_equals.sql
(1 hunks)macros/assert_equals.sql
(1 hunks)macros/assert_false.sql
(1 hunks)macros/assert_in.sql
(1 hunks)macros/assert_is_none.sql
(1 hunks)macros/assert_is_not_none.sql
(1 hunks)macros/assert_list_equals.sql
(1 hunks)macros/assert_not_equals.sql
(1 hunks)macros/assert_not_in.sql
(1 hunks)macros/assert_true.sql
(1 hunks)macros/comparisons/dict_equals.sql
(1 hunks)macros/comparisons/equals.sql
(1 hunks)macros/comparisons/in.sql
(1 hunks)macros/comparisons/is_false.sql
(1 hunks)macros/comparisons/is_none.sql
(1 hunks)macros/comparisons/is_not_none.sql
(1 hunks)macros/comparisons/is_true.sql
(1 hunks)macros/comparisons/not_equals.sql
(1 hunks)macros/comparisons/not_in.sql
(1 hunks)
🔇 Additional comments (39)
macros/comparisons/is_none.sql (1)
1-3
: Verify test coverage and integration
Let's ensure proper test coverage and integration with the testing framework.
✅ Verification successful
Test coverage and integration verified successfully
The macro is well-integrated with comprehensive test coverage:
- Dedicated test file exists at
integration_tests/macros/tests/comparisons/test_is_none.sql
- Test cases cover various scenarios (none, boolean, number, list, dict)
- Properly integrated within the comparison macros suite alongside related macros (is_true, is_false, etc.)
- Has both direct tests and assertion wrapper tests (test_assert_is_none)
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for test files and related comparison macros
# Check for test files
echo "Looking for test files..."
fd test_is_none.sql
# Check for related comparison macros
echo "Looking for related comparison macros..."
fd . macros/comparisons/
# Check for usage in integration tests
echo "Checking usage in integration tests..."
rg "is_none\(" integration_tests/
Length of output: 1667
macros/comparisons/is_not_none.sql (1)
1-3
: LGTM! Clean and correct implementation.
The macro implementation is concise and follows SQL's native syntax for null checks.
macros/comparisons/equals.sql (1)
1-3
: Verify test coverage and usage patterns
Let's ensure this macro has proper test coverage and is being used consistently.
✅ Verification successful
Macro has comprehensive test coverage and consistent usage patterns
The equals
macro is well-integrated into the testing framework with:
- Direct unit tests in
integration_tests/macros/tests/comparisons/test_equals.sql
- Usage in assertion macros like
assert_equals
,assert_list_equals
, andassert_dict_equals
- Comprehensive test cases covering various data types and edge cases
- No naming conflicts found in the codebase
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for test files and usage patterns of the equals macro
# Check for corresponding test files
echo "Looking for test files..."
fd "test_equals.sql"
# Check for usage patterns
echo "Checking usage patterns..."
rg "equals\(" --type sql -A 2 -B 2
# Check for potential conflicting macros
echo "Checking for potential naming conflicts..."
rg "macro equals\(" --type sql
Length of output: 17311
macros/comparisons/not_equals.sql (1)
1-3
: LGTM! Clean and focused implementation.
The macro implementation is concise and follows the single responsibility principle. It's a good addition to the testing framework.
Let's verify its usage in test files:
macros/comparisons/is_true.sql (1)
1-3
: Verify behavior across different database dialects
Since boolean handling can vary across different SQL dialects, we should ensure consistent behavior.
✅ Verification successful
Let me search for more specific information about boolean handling and test cases.
Let me try one more search with corrected syntax:
Boolean handling implementation is well-tested and consistent
Based on the comprehensive test suite found in the codebase, the is_true
macro has been thoroughly tested across different scenarios:
- Direct boolean values (
true
/false
) - Boolean expressions (
x == 5
,x != 5
) - The implementation uses both equality (
==
) and identity (is
) checks for robustness - Test cases cover both positive and negative scenarios
The macro is part of a complete boolean handling system that includes complementary macros like is_false
, assert_true
, and assert_false
, all working consistently together.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for any database-specific implementations or tests
rg -g '!node_modules' -A 5 'is_true.*test'
# Look for database adapter configurations to understand supported dialects
fd -g 'dbt_project.yml' -X cat
Length of output: 634
Script:
#!/bin/bash
# Search for boolean-related test cases and implementations
rg -g '!node_modules' -A 5 'bool|boolean|true|false' 'tests/'
# Look for database adapter specific code
fd adapter -t f -X cat
# Search for any usage of is_true macro
rg -g '!node_modules' -A 3 '{%\s*is_true'
Length of output: 265
Script:
#!/bin/bash
# Search for any usage of is_true macro with fixed regex
rg -g '!node_modules' '{%.*is_true'
# Look for test files with .sql extension
fd -e sql -p 'test' -X cat
# Search for boolean handling in SQL files
rg -g '*.sql' -A 3 'bool|boolean|true|false'
Length of output: 24799
macros/comparisons/is_false.sql (2)
1-3
: LGTM! The core implementation is sound
The macro correctly handles both equality comparison (==
) and identity comparison (is
) for false values, which is a robust approach.
2-2
: Consider explicit NULL handling
The current implementation might behave differently across databases when the condition is NULL. Consider adding explicit NULL handling.
Let's verify NULL handling behavior across different dbt adapters:
Consider updating the implementation to handle NULL explicitly:
- {{ return(condition == false or condition is false) }}
+ {{ return(condition is not none and (condition == false or condition is false)) }}
macros/assert_is_none.sql (1)
1-5
: Clean and focused implementation!
The macro follows good practices with a single responsibility and proper error handling using dbt's standard mechanisms.
macros/assert_is_not_none.sql (1)
1-5
: LGTM! Clean and minimal implementation.
The refactored macro follows good practices by:
- Delegating the check to a dedicated helper function
- Following single responsibility principle
- Removing unnecessary success logging
macros/assert_true.sql (2)
2-2
: Verify existence and implementation of dbt_unittest.is_true()
The macro now depends on dbt_unittest.is_true()
. Let's ensure this function exists and understand its behavior.
✅ Verification successful
dbt_unittest.is_true()
exists and is properly implemented
The function exists in macros/comparisons/is_true.sql
and has a straightforward implementation that checks if a condition is true using both equality and identity comparisons, which is appropriate for its use case in assertions.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for the implementation of is_true function
fd -e sql -x rg -l 'macro\s+is_true\s*\(' {}
Length of output: 81
Script:
#!/bin/bash
# Let's check the implementation of is_true function
cat ./macros/comparisons/is_true.sql
Length of output: 139
1-1
: Verify impact of parameter rename across the codebase
The parameter rename from value
to condition
is a breaking change that could affect existing tests.
✅ Verification successful
Let me check if this is a new macro or if there's a history of changes by looking for git history and any documentation.
Let me check the content of the README files to understand if this is a new package or if there's documentation about the breaking changes.
Based on the gathered information, I can now provide the final response:
Parameter rename is safe - all usages are within test files
The change from value
to condition
parameter is safe as:
- All existing usages are within the package's own integration tests
- The README documents the new parameter name in examples
- No external usage patterns were found that could break
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for existing uses of assert_true to identify potential breaking changes
rg -g '*.sql' 'assert_true\s*\(\s*[^)]'
Length of output: 476
Script:
#!/bin/bash
# Check git history for the assert_true macro
git log -p macros/assert_true.sql | head -n 50
# Check for documentation or readme files
fd README -e md
Length of output: 55
Script:
#!/bin/bash
# Check README contents
cat README.md
cat integration_tests/README.md
Length of output: 3690
macros/assert_false.sql (2)
1-1
: LGTM! Parameter rename improves clarity.
The parameter rename from value
to condition
better represents the intended usage and improves code readability.
2-2
: Verify dbt_unittest.is_false implementation.
The macro depends on dbt_unittest.is_false()
. Let's verify its implementation and usage across the codebase.
✅ Verification successful
Let me check the implementation of is_false
macro to complete the verification.
Implementation of dbt_unittest.is_false()
is correct and well-tested
The is_false()
macro is properly implemented to check if a condition is false using both equality comparison and is
operator. It's thoroughly tested with:
- Direct boolean values (true/false)
- Boolean expressions
- Different comparison scenarios
The implementation and its usage in assert_false.sql
are consistent and reliable.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the implementation and usage of dbt_unittest.is_false
# Find the implementation
echo "Looking for is_false implementation:"
rg -l "macro.*is_false"
# Find all usages
echo -e "\nLooking for is_false usages:"
rg "is_false\(" --type sql
Length of output: 1051
Script:
#!/bin/bash
# Get the implementation of is_false macro
echo "Content of is_false implementation:"
cat macros/comparisons/is_false.sql
echo -e "\nContent of test_is_false:"
cat integration_tests/macros/tests/comparisons/test_is_false.sql
Length of output: 1235
macros/assert_in.sql (1)
2-3
: LGTM! Clean and efficient implementation.
The changes improve the code by:
- Using a centralized comparison function
- Removing unnecessary success logging
- Maintaining clear error messages
Let's verify the implementation of the dbt_unittest.in()
function:
✅ Verification successful
Implementation of dbt_unittest.in()
is well-tested and consistent
The verification shows:
- The
in()
macro is properly implemented inmacros/comparisons/in.sql
with special handling for different collection types - Integration tests in
integration_tests/macros/tests/comparisons/test_in.sql
cover:- List membership (positive and negative cases)
- String containment (positive and negative cases)
- The implementation is used consistently across the codebase
- The error message format aligns with other assertion macros
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the implementation and usage of dbt_unittest.in()
# Expected: Find the implementation and other usages to ensure consistency
# Find the implementation
rg -A 5 "macro.*in\(" macros/
# Find other assertions using this function
rg -A 3 "dbt_unittest.in"
Length of output: 3294
macros/assert_list_equals.sql (1)
1-1
: LGTM! Parameter naming improvement
The rename from value
to actual
follows testing best practices and improves code clarity by making the parameter's purpose more explicit.
macros/assert_dict_equals.sql (1)
1-1
: LGTM! Clear parameter naming.
The parameter rename from value
to actual
improves clarity and follows testing conventions by using the standard "actual vs expected" pattern.
macros/assert_not_in.sql (2)
3-3
: LGTM: Clear error message format.
The error message format clearly indicates both the value being checked and the collection it was unexpectedly found in, which will help with debugging test failures.
1-2
: Verify the impact of parameter rename and function dependency.
The parameter rename from expected
to unexpected
is semantically clearer but represents a breaking change.
Let's verify the usage and dependency:
✅ Verification successful
Parameter rename and function dependency are correctly implemented
The changes are well-structured and safe:
- The
not_in
function exists inmacros/comparisons/not_in.sql
with proper implementation for different data types - All existing usages in test files already use the new parameter name
unexpected
- The integration tests demonstrate correct usage patterns and verify the functionality
- No instances of old parameter name usage were found in the codebase
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check for any remaining uses of the old parameter name
rg -g '*.sql' 'assert_not_in.*expected.*\)'
# Verify the existence of dbt_unittest.not_in function
fd -e sql -x grep -l "macro.*not_in" {}
Length of output: 335
Script:
#!/bin/bash
# Check the implementation of not_in function
cat ./macros/comparisons/not_in.sql
# Check test files to understand usage patterns
cat ./integration_tests/macros/tests/comparisons/test_not_in.sql
cat ./integration_tests/macros/tests/test_assert_not_in.sql
# Look for any other assert_not_in usages in the codebase
rg -g '*.sql' 'assert_not_in\(' -A 2
Length of output: 2700
macros/assert_equals.sql (2)
1-1
: LGTM! Parameter rename improves clarity.
The change from value
to actual
follows standard testing conventions and makes the parameter's purpose more explicit.
1-3
: Verify consistent usage of the new parameter name.
Since this is a breaking change (renamed parameter), we should verify that all existing calls to this macro have been updated.
✅ Verification successful
No issues found with parameter usage across the codebase
The search results show that all calls to assert_equals
are using the new parameter names (actual, expected
) or are using positional arguments without named parameters. There are no instances of the old parameter name being used in any calls to this macro.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for any remaining uses of the old parameter name in assert_equals calls
rg -g '*.sql' 'assert_equals\s*\(\s*value\s*[,)]'
# Find all current uses of the macro for manual verification
rg -g '*.sql' 'assert_equals\s*\(' -A 2
Length of output: 1465
macros/assert_not_equals.sql (2)
1-1
: LGTM! Parameter naming improvements enhance clarity.
The renamed parameters actual
and unexpected
are more descriptive and better align with testing terminology.
2-2
: Verify dbt_unittest module integration.
The macro relies on dbt_unittest.not_equals()
. Let's ensure this dependency is properly available.
✅ Verification successful
Let me check the actual implementation of the not_equals
function to ensure it's properly defined.
The dbt_unittest.not_equals()
dependency is properly integrated
The verification shows that:
- The project is correctly named as "dbt_unittest" in dbt_project.yml
- The
not_equals
macro is properly defined inmacros/comparisons/not_equals.sql
- The implementation is correct and matches the usage in
assert_not_equals.sql
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the dbt_unittest module is properly defined and accessible
# Expected: Find the module definition and any package references
# Search for dbt_unittest module definition
echo "Searching for dbt_unittest module definition..."
rg -l "dbt_unittest"
# Search for package references in dbt_project.yml
echo "Checking package references..."
rg "dbt_unittest" dbt_project.yml
Length of output: 1614
Script:
#!/bin/bash
# Search for the not_equals function definition
ast-grep --pattern 'macro not_equals($$$)'
# Also search with ripgrep for any direct definition
rg -A 5 "macro not_equals"
Length of output: 270
macros/comparisons/in.sql (2)
15-16
: LGTM!
The return statement correctly returns the boolean result.
4-13
: Verify handling of edge cases.
The type handling logic looks correct, but consider testing these edge cases:
- Null values for either parameter
- Empty collections (empty list, dict, string)
- Special characters in strings
- Nested collections
Let's check if there are tests covering these cases:
macros/comparisons/not_in.sql (2)
14-16
: LGTM!
The return statement is clean and properly formatted.
5-7
: Clarify mapping comparison behavior
The current implementation only checks keys in mappings. Consider whether checking values is also needed for completeness.
integration_tests/macros/tests/comparisons/test_equals.sql (2)
8-12
: LGTM!
The negative test case is well-implemented with a clear error message.
1-25
: Verify integration with the test framework.
Let's verify how this macro is integrated with other test macros and ensure consistent error handling across the testing framework.
✅ Verification successful
Error handling and test integration patterns are consistent
The verification shows that:
- The
test_equals
macro follows the same error handling pattern (exceptions.raise_compiler_error
) as other test macros in the framework - It's properly integrated and called from
test_macros.sql
- The error messages follow a consistent format across all test macros
- The test cases cover both positive and negative scenarios similar to other comparison tests
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for consistent error handling patterns across test macros
# Look for similar error handling patterns in other test macros
rg -A 2 "exceptions.raise_compiler_error" integration_tests/macros/tests/
# Check for references to test_equals in other files
rg "test_equals" integration_tests/
Length of output: 12111
integration_tests/macros/tests/comparisons/test_not_equals.sql (1)
1-1
: LGTM! Clean macro declaration.
The macro name is descriptive and follows dbt naming conventions.
integration_tests/macros/tests/comparisons/test_is_true.sql (1)
1-26
: Verify test framework integration.
The implementation looks solid, but let's verify integration with the broader testing framework.
✅ Verification successful
Test macro is well-integrated with the testing framework
The verification shows that:
- The
test_is_true
macro follows the same pattern as other comparison test macros (test_is_false
,test_is_none
) - It's properly integrated with
assert_true.sql
which usesdbt_unittest.is_true
- The implementation is consistent with the broader testing framework that includes various comparison operations (equals, not_equals, in, not_in, etc.)
- The macro is part of a comprehensive test suite with proper test coverage and consistent implementation patterns
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check for consistent patterns across test macros
echo "Checking for consistent test patterns across macros..."
rg -t sql "{% macro test_is_" integration_tests/macros/tests/comparisons/
# Check for usage of the is_true function
echo "Checking for usage of is_true function..."
rg -t sql "dbt_unittest.is_true" --glob '!test_is_true.sql'
Length of output: 510
Script:
#!/bin/bash
# Let's fix the regex and check for test patterns
echo "Checking for test patterns in comparisons..."
rg -t sql "macro test_is" integration_tests/macros/tests/comparisons/
# Check the assert_true.sql implementation
echo "Checking assert_true.sql implementation..."
cat macros/assert_true.sql
# Look for other comparison test macros
echo "Checking for other comparison test macros..."
fd -e sql . integration_tests/macros/tests/comparisons/
# Check for any other usage of dbt_unittest
echo "Checking for other dbt_unittest usage patterns..."
rg -t sql "dbt_unittest\." --glob '!test_is_true.sql'
Length of output: 9678
integration_tests/macros/tests/comparisons/test_is_false.sql (2)
1-26
: Well-structured test macro with comprehensive test cases!
The macro is well-organized with clear test case separation and descriptive comments. The implementation follows dbt testing conventions and provides good coverage of different scenarios.
1-26
: Consider adding edge case tests
The current test cases cover the basic scenarios well. Consider adding tests for edge cases such as:
- Null values
- Non-boolean inputs (if applicable to the implementation)
- Complex boolean expressions with multiple conditions
This would ensure robust error handling in all scenarios.
Let's check if similar test macros handle these edge cases:
integration_tests/macros/tests/comparisons/test_in.sql (1)
1-25
: Verify integration with dbt's test framework.
The macro looks well-structured, but we should verify its integration with dbt's test framework and consider adding debug logging.
Consider adding debug logging for successful test cases:
{% macro test_in() %}
+ {% do log("Running in comparison tests...", info=true) %}
{# Test successful in condition with list #}
{% set result1 = dbt_unittest.in(5, [1, 2, 3, 4, 5]) %}
{% if not result1 %}
{{ exceptions.raise_compiler_error("Failed: 5 should be in [1, 2, 3, 4, 5]") }}
+ {% else %}
+ {% do log("✓ List containment test passed", info=true) %}
{% endif %}
...
{% endmacro %}
✅ Verification successful
The test_in macro is properly integrated with dbt's test framework
The macro is correctly integrated into the test suite as evidenced by:
- It's properly included in the main test runner
test_macros.sql
- It follows the same error handling patterns as other test macros in the codebase
- It's part of a comprehensive test suite with consistent patterns across all comparison tests
The suggestion for adding debug logging, while nice to have, isn't necessary as the macro follows the established testing patterns in the codebase.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check if this macro is properly referenced in the main test suite
rg -l "test_in" --type sql
# Look for similar test patterns in the codebase
ast-grep --pattern 'exceptions.raise_compiler_error("Failed: $_")' --lang jinja2
Length of output: 324
Script:
#!/bin/bash
# Check the content of test_macros.sql to see how test_in is integrated
cat integration_tests/macros/tests/test_macros.sql
# Look for similar test patterns without language specification
ast-grep --pattern 'exceptions.raise_compiler_error'
# Check if there are any dbt test configurations
fd "schema.yml|properties.yml" --type f
Length of output: 17127
integration_tests/macros/tests/comparisons/test_is_none.sql (1)
1-1
: Verify test macro integration
Let's verify that this test macro follows the same patterns as other test macros and is properly integrated with the test runner.
✅ Verification successful
Test macro follows consistent patterns and is properly integrated
The verification shows that:
- The
test_is_none
macro follows the same pattern as other test macros in the comparisons directory:- Uses the
dbt_unittest
namespace - Has similar error handling with
exceptions.raise_compiler_error
- Follows consistent naming and implementation structure
- Uses the
- The macro is properly referenced in its expected location
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check for similar test macro patterns in other files
echo "Checking for similar test macro patterns..."
fd . integration_tests/macros/tests/comparisons -t f -e sql -x cat {} \; | grep -A 5 "^{% macro test_"
# Verify that the test macro is referenced in the test runner
echo "Verifying test runner integration..."
rg "test_is_none" -t sql
Length of output: 2307
integration_tests/macros/tests/comparisons/test_not_in.sql (2)
1-2
: LGTM! Well-structured macro declaration.
The macro follows the naming convention and is appropriately structured as a self-contained test.
3-3
: Verify dbt_unittest module dependency.
The macro relies on the dbt_unittest module. Let's verify its implementation and availability.
✅ Verification successful
Let me search for the actual implementation of the not_in
macro to complete the verification.
Module dependency verification completed successfully
The not_in
macro is properly implemented in the codebase with:
- Complete implementation handling different types (mappings, iterables, strings)
- Consistent usage across test files
- Associated assertion macro for error handling
- Comprehensive test coverage including positive and negative cases
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for dbt_unittest module definition and its not_in function
ast-grep --pattern 'macro not_in($_)'
# Search for other uses of the module to ensure consistency
rg "dbt_unittest.not_in" -A 2
Length of output: 1680
Script:
#!/bin/bash
# Search for the not_in macro implementation
fd "not_in.sql" --type f --exec cat {}
Length of output: 1870
macros/comparisons/dict_equals.sql (2)
38-40
: LGTM! Clear and well-documented final return.
The final return statement and its accompanying comment clearly indicate the successful case.
31-36
: Consider edge cases in value comparison.
The direct value comparison (!=
) might not handle all cases correctly, such as nested dictionaries or special value types (timestamps, decimals).
Let's check if there are any special value types in the codebase:
Consider adding specialized comparison logic for known special types in your codebase. For nested dictionaries, you might want to recursively call dict_equals
.
integration_tests/macros/tests/comparisons/test_dict_equals.sql (1)
64-85
: Verify error handling in the underlying dict_equals function.
The tests look good, but we should verify that the underlying dbt_unittest.dict_equals
function handles errors gracefully.
✅ Verification successful
Error handling in dict_equals is comprehensive and well-implemented
The dict_equals
macro includes robust error handling:
- Handles
None
values explicitly - Validates input types using
is not mapping
check - Properly handles key existence and value comparisons
- Returns clear boolean results for all cases
The test cases in the review complement this implementation well by covering empty dictionaries and mixed value types, which exercise these error handling paths.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for the dict_equals implementation and its error handling
ast-grep --pattern 'macro dict_equals($$$) {
$$$
}'
Length of output: 55
Script:
#!/bin/bash
# Let's try a different approach to find the dict_equals macro implementation
rg -A 10 "macro dict_equals" --type sql
Length of output: 694
Script:
#!/bin/bash
# Let's see the complete implementation of dict_equals
cat macros/comparisons/dict_equals.sql
Length of output: 1082
{% if value is not iterable %} | ||
{% do exceptions.raise_compiler_error("FAILED: 1st argument " ~ value ~ " is not iterable.") %} | ||
{% macro assert_list_equals(actual, expected) %} | ||
{% if not dbt_unittest.list_equals(actual, expected) %} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Consider adding input validation
The macro directly uses dbt_unittest.list_equals
without validating that inputs are actually lists. This could lead to confusing error messages if non-list arguments are provided.
Consider adding type validation:
{% macro assert_list_equals(actual, expected) %}
+ {% if not (actual is iterable and expected is iterable) %}
+ {% do exceptions.raise_compiler_error("FAILED: Both arguments must be lists.") %}
+ {% endif %}
{% if not dbt_unittest.list_equals(actual, expected) %}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
{% if not dbt_unittest.list_equals(actual, expected) %} | |
{% if not (actual is iterable and expected is iterable) %} | |
{% do exceptions.raise_compiler_error("FAILED: Both arguments must be lists.") %} | |
{% endif %} | |
{% if not dbt_unittest.list_equals(actual, expected) %} |
💡 Codebase verification
Based on our thorough search of the codebase, we can now generate the final response:
Implementation of list_equals function is missing
The codebase uses dbt_unittest.list_equals
in the assertion macro but its implementation is not found in the repository. This is concerning as the function is critical for list comparison assertions.
- The function is used in
macros/assert_list_equals.sql
but its implementation is missing - Test cases in
test_assert_list_equals()
suggest it should handle empty lists, numeric lists, and string lists - Other comparison functions like
dict_equals
,equals
, andnot_equals
are properly implemented
🔗 Analysis chain
Verify the implementation of list_equals
Let's check the implementation of the dbt_unittest.list_equals
function to ensure it handles all edge cases correctly.
Let me search for the actual implementation of list_equals
function since we only found its usage.
Let me search for the implementation in other potential locations.
Let me search one more time specifically for the list_equals
implementation.
Let me try one final search with a different pattern.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for the implementation of list_equals function
rg -g '*.sql' -A 10 'macro.*list_equals'
Length of output: 909
Script:
#!/bin/bash
# Search for the implementation of list_equals function in dbt_unittest namespace
rg -g '*.sql' -A 10 'macro.*dbt_unittest.list_equals'
# Search for any file that might contain the implementation
fd -g '*.sql' -x cat {} | grep -A 10 'list_equals'
Length of output: 1277
Script:
#!/bin/bash
# Search for list_equals implementation in macros directory
fd -g '*.sql' -x cat {} | grep -B 5 -A 10 'macro.*list_equals'
# Search in any comparison related files
fd -g '*compare*.sql' -x cat {}
fd -g '*equals*.sql' -x cat {}
Length of output: 9866
Script:
#!/bin/bash
# Search for list_equals implementation in any SQL file
fd -g '*.sql' -x cat {} | grep -B 5 -A 15 'macro.*list_equals\s*\('
# Search in comparison.sql or list.sql if they exist
fd -g 'comparison.sql' -x cat {}
fd -g 'list.sql' -x cat {}
Length of output: 159
Script:
#!/bin/bash
# Search for list_equals implementation in macros directory
fd -g '*.sql' macros -x cat {} | grep -B 5 -A 15 'list_equals'
# Search in any utility or helper files
fd -g '*util*.sql' -x cat {}
fd -g '*helper*.sql' -x cat {}
Length of output: 1007
{% macro test_macros() %} | ||
{% do test_assert_dict_equals() %} | ||
|
||
{% do test_assert_equals() %} | ||
|
||
{% do test_assert_false() %} | ||
|
||
{% do test_assert_in() %} | ||
|
||
{% do test_assert_not_in() %} | ||
|
||
{% do test_assert_is_none() %} | ||
|
||
{% do test_assert_is_not_none() %} | ||
|
||
{% do test_assert_list_equals() %} | ||
|
||
{% do test_assert_not_equals() %} | ||
|
||
{% do test_assert_true() %} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
Deprecate old assertion macros in favor of new comparison macros
The verification confirms there is direct functional overlap between old and new implementations:
test_assert_true()
→test_is_true()
test_assert_false()
→test_is_false()
test_assert_equals()
→test_equals()
test_assert_not_equals()
→test_not_equals()
test_assert_in()
→test_in()
test_assert_not_in()
→test_not_in()
test_assert_is_none()
→test_is_none()
test_assert_dict_equals()
→test_dict_equals()
The new implementations in comparisons/
directory provide better error messages and a more consistent naming convention. Recommend:
- Add
{# @deprecated #}
comments to old assertion macros - Update documentation to direct users to new comparison macros
- Plan removal in next major version
🔗 Analysis chain
Consider deprecating old assertion macros.
The old assertion macros appear to duplicate functionality now provided by the new comparison macros. To maintain clarity and prevent confusion:
- Mark these old assertions as deprecated
- Add migration documentation
- Plan for their eventual removal
Let's verify the duplication between old and new assertions:
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Compare old and new assertion implementations
# Expected: Find matching functionality between old and new implementations
# Search for old assertion implementations
echo "=== Old Assertions ==="
rg -A 5 "macro test_assert_" integration_tests/macros/
# Search for new assertion implementations
echo "=== New Assertions ==="
rg -A 5 "macro test_" integration_tests/macros/tests/comparisons/
Length of output: 9778
{# Test string equality #} | ||
{% set result3 = dbt_unittest.equals('hello', 'hello') %} | ||
{% if not result3 %} | ||
{{ exceptions.raise_compiler_error("Failed: 'hello' should equal 'hello'") }} | ||
{% endif %} | ||
|
||
{# Test string inequality #} | ||
{% set result4 = dbt_unittest.equals('hello', 'world') %} | ||
{% if result4 %} | ||
{{ exceptions.raise_compiler_error("Failed: 'hello' should not equal 'world'") }} | ||
{% endif %} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Enhance string comparison test coverage.
Consider adding test cases for:
- Case sensitivity ('Hello' vs 'hello')
- Whitespace handling (' hello ' vs 'hello')
- Empty strings
- Special characters
{% set result4 = dbt_unittest.equals('hello', 'world') %}
{% if result4 %}
{{ exceptions.raise_compiler_error("Failed: 'hello' should not equal 'world'") }}
{% endif %}
+
+ {# Test case sensitivity #}
+ {% set result5 = dbt_unittest.equals('Hello', 'hello') %}
+ {% if result5 %}
+ {{ exceptions.raise_compiler_error("Failed: 'Hello' should not equal 'hello'") }}
+ {% endif %}
+
+ {# Test whitespace handling #}
+ {% set result6 = dbt_unittest.equals(' hello ', 'hello') %}
+ {% if result6 %}
+ {{ exceptions.raise_compiler_error("Failed: ' hello ' should not equal 'hello'") }}
+ {% endif %}
+
+ {# Test empty strings #}
+ {% set result7 = dbt_unittest.equals('', '') %}
+ {% if not result7 %}
+ {{ exceptions.raise_compiler_error("Failed: empty string should equal empty string") }}
+ {% endif %}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
{# Test string equality #} | |
{% set result3 = dbt_unittest.equals('hello', 'hello') %} | |
{% if not result3 %} | |
{{ exceptions.raise_compiler_error("Failed: 'hello' should equal 'hello'") }} | |
{% endif %} | |
{# Test string inequality #} | |
{% set result4 = dbt_unittest.equals('hello', 'world') %} | |
{% if result4 %} | |
{{ exceptions.raise_compiler_error("Failed: 'hello' should not equal 'world'") }} | |
{% endif %} | |
{# Test string equality #} | |
{% set result3 = dbt_unittest.equals('hello', 'hello') %} | |
{% if not result3 %} | |
{{ exceptions.raise_compiler_error("Failed: 'hello' should equal 'hello'") }} | |
{% endif %} | |
{# Test string inequality #} | |
{% set result4 = dbt_unittest.equals('hello', 'world') %} | |
{% if result4 %} | |
{{ exceptions.raise_compiler_error("Failed: 'hello' should not equal 'world'") }} | |
{% endif %} | |
{# Test case sensitivity #} | |
{% set result5 = dbt_unittest.equals('Hello', 'hello') %} | |
{% if result5 %} | |
{{ exceptions.raise_compiler_error("Failed: 'Hello' should not equal 'hello'") }} | |
{% endif %} | |
{# Test whitespace handling #} | |
{% set result6 = dbt_unittest.equals(' hello ', 'hello') %} | |
{% if result6 %} | |
{{ exceptions.raise_compiler_error("Failed: ' hello ' should not equal 'hello'") }} | |
{% endif %} | |
{# Test empty strings #} | |
{% set result7 = dbt_unittest.equals('', '') %} | |
{% if not result7 %} | |
{{ exceptions.raise_compiler_error("Failed: empty string should equal empty string") }} | |
{% endif %} |
{% macro test_not_equals() %} | ||
{# Test successful not equals #} | ||
{% set result1 = dbt_unittest.not_equals(5, 6) %} | ||
{% if not result1 %} | ||
{{ exceptions.raise_compiler_error("Failed: 5 should not equal 6") }} | ||
{% endif %} | ||
|
||
{# Test failed not equals #} | ||
{% set result2 = dbt_unittest.not_equals(5, 5) %} | ||
{% if result2 %} | ||
{{ exceptions.raise_compiler_error("Failed: 5 should equal 5") }} | ||
{% endif %} | ||
|
||
{# Test string not equals #} | ||
{% set result3 = dbt_unittest.not_equals('hello', 'world') %} | ||
{% if not result3 %} | ||
{{ exceptions.raise_compiler_error("Failed: 'hello' should not equal 'world'") }} | ||
{% endif %} | ||
|
||
{# Test string equals #} | ||
{% set result4 = dbt_unittest.not_equals('hello', 'hello') %} | ||
{% if result4 %} | ||
{{ exceptions.raise_compiler_error("Failed: 'hello' should equal 'hello'") }} | ||
{% endif %} | ||
{% endmacro %} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Consider adding tests for edge cases.
The current test suite covers basic integer and string comparisons, but could be enhanced with additional test cases:
- NULL value comparisons
- Different data type comparisons (e.g., string vs integer)
- Empty string comparisons
- Special character string comparisons
Would you like me to provide an implementation for these additional test cases?
{% set result3 = dbt_unittest.in('a', 'abcde') %} | ||
{% if not result3 %} | ||
{{ exceptions.raise_compiler_error("Failed: 'a' should be in 'abcde'") }} | ||
{% endif %} | ||
|
||
{# Test failed in condition with string #} | ||
{% set result4 = dbt_unittest.in('f', 'abcde') %} | ||
{% if result4 %} | ||
{{ exceptions.raise_compiler_error("Failed: 'f' should not be in 'abcde'") }} | ||
{% endif %} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Add edge cases and improve variable naming.
Consider adding edge cases for empty strings and improve variable naming for clarity.
- {% set result3 = dbt_unittest.in('a', 'abcde') %}
- {% if not result3 %}
+ {% set is_a_in_string = dbt_unittest.in('a', 'abcde') %}
+ {% if not is_a_in_string %}
- {% set result4 = dbt_unittest.in('f', 'abcde') %}
- {% if result4 %}
+ {% set is_f_in_string = dbt_unittest.in('f', 'abcde') %}
+ {% if is_f_in_string %}
+ {# Test edge case with empty string #}
+ {% set is_empty_in_string = dbt_unittest.in('', 'abcde') %}
+ {% if is_empty_in_string %}
+ {{ exceptions.raise_compiler_error("Failed: empty string should not be in 'abcde'") }}
+ {% endif %}
Committable suggestion skipped: line range outside the PR's diff.
{% macro test_is_none() %} | ||
{# Test successful is_none condition #} | ||
{% set result1 = dbt_unittest.is_none(none) %} | ||
{% if not result1 %} | ||
{{ exceptions.raise_compiler_error("Failed: None should be None") }} | ||
{% endif %} | ||
|
||
{# Test failed is_none conditions #} | ||
{% set result2 = dbt_unittest.is_none(true) %} | ||
{% if result2 %} | ||
{{ exceptions.raise_compiler_error("Failed: true should not be None") }} | ||
{% endif %} | ||
|
||
{% set result3 = dbt_unittest.is_none(1) %} | ||
{% if result3 %} | ||
{{ exceptions.raise_compiler_error("Failed: 1 should not be None") }} | ||
{% endif %} | ||
|
||
{% set result4 = dbt_unittest.is_none([1, 2, 3]) %} | ||
{% if result4 %} | ||
{{ exceptions.raise_compiler_error("Failed: list should not be None") }} | ||
{% endif %} | ||
|
||
{% set result5 = dbt_unittest.is_none({"1": "2"}) %} | ||
{% if result5 %} | ||
{{ exceptions.raise_compiler_error("Failed: dictionary should not be None") }} | ||
{% endif %} | ||
{% endmacro %} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Consider refactoring to reduce code duplication
The current implementation repeats similar test patterns. Consider creating a helper macro to reduce duplication and make the tests more maintainable.
+{% macro assert_is_not_none(value, description) %}
+ {% set result = dbt_unittest.is_none(value) %}
+ {% if result %}
+ {{ exceptions.raise_compiler_error("Failed: " ~ description ~ " should not be None") }}
+ {% endif %}
+{% endmacro %}
+
{% macro test_is_none() %}
{# Test successful is_none condition #}
{% set result1 = dbt_unittest.is_none(none) %}
{% if not result1 %}
{{ exceptions.raise_compiler_error("Failed: None should be None") }}
{% endif %}
{# Test failed is_none conditions #}
- {% set result2 = dbt_unittest.is_none(true) %}
- {% if result2 %}
- {{ exceptions.raise_compiler_error("Failed: true should not be None") }}
- {% endif %}
-
- {% set result3 = dbt_unittest.is_none(1) %}
- {% if result3 %}
- {{ exceptions.raise_compiler_error("Failed: 1 should not be None") }}
- {% endif %}
-
- {% set result4 = dbt_unittest.is_none([1, 2, 3]) %}
- {% if result4 %}
- {{ exceptions.raise_compiler_error("Failed: list should not be None") }}
- {% endif %}
-
- {% set result5 = dbt_unittest.is_none({"1": "2"}) %}
- {% if result5 %}
- {{ exceptions.raise_compiler_error("Failed: dictionary should not be None") }}
- {% endif %}
+ {{ assert_is_not_none(true, "true") }}
+ {{ assert_is_not_none(1, "1") }}
+ {{ assert_is_not_none([1, 2, 3], "list") }}
+ {{ assert_is_not_none({"1": "2"}, "dictionary") }}
{% endmacro %}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
{% macro test_is_none() %} | |
{# Test successful is_none condition #} | |
{% set result1 = dbt_unittest.is_none(none) %} | |
{% if not result1 %} | |
{{ exceptions.raise_compiler_error("Failed: None should be None") }} | |
{% endif %} | |
{# Test failed is_none conditions #} | |
{% set result2 = dbt_unittest.is_none(true) %} | |
{% if result2 %} | |
{{ exceptions.raise_compiler_error("Failed: true should not be None") }} | |
{% endif %} | |
{% set result3 = dbt_unittest.is_none(1) %} | |
{% if result3 %} | |
{{ exceptions.raise_compiler_error("Failed: 1 should not be None") }} | |
{% endif %} | |
{% set result4 = dbt_unittest.is_none([1, 2, 3]) %} | |
{% if result4 %} | |
{{ exceptions.raise_compiler_error("Failed: list should not be None") }} | |
{% endif %} | |
{% set result5 = dbt_unittest.is_none({"1": "2"}) %} | |
{% if result5 %} | |
{{ exceptions.raise_compiler_error("Failed: dictionary should not be None") }} | |
{% endif %} | |
{% endmacro %} | |
{% macro assert_is_not_none(value, description) %} | |
{% set result = dbt_unittest.is_none(value) %} | |
{% if result %} | |
{{ exceptions.raise_compiler_error("Failed: " ~ description ~ " should not be None") }} | |
{% endif %} | |
{% endmacro %} | |
{% macro test_is_none() %} | |
{# Test successful is_none condition #} | |
{% set result1 = dbt_unittest.is_none(none) %} | |
{% if not result1 %} | |
{{ exceptions.raise_compiler_error("Failed: None should be None") }} | |
{% endif %} | |
{# Test failed is_none conditions #} | |
{{ assert_is_not_none(true, "true") }} | |
{{ assert_is_not_none(1, "1") }} | |
{{ assert_is_not_none([1, 2, 3], "list") }} | |
{{ assert_is_not_none({"1": "2"}, "dictionary") }} | |
{% endmacro %} |
{# Check key lengths #} | ||
{% set actual_keys = actual.keys() | list | sort %} | ||
{% set expected_keys = expected.keys() | list | sort %} | ||
{% if actual_keys | length != expected_keys | length %} | ||
{{ return(false) }} | ||
{% endif %} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Optimize key handling for better performance.
The current implementation sorts keys before comparing lengths, which is unnecessary at this stage. Additionally, the keys are sorted twice in the macro.
Consider this optimization:
- {# Check key lengths #}
- {% set actual_keys = actual.keys() | list | sort %}
- {% set expected_keys = expected.keys() | list | sort %}
- {% if actual_keys | length != expected_keys | length %}
+ {# Quick length check before detailed comparison #}
+ {% if actual.keys() | length != expected.keys() | length %}
{{ return(false) }}
{% endif %}
+
+ {# Get sorted keys for detailed comparison #}
+ {% set actual_keys = actual.keys() | list | sort %}
+ {% set expected_keys = expected.keys() | list | sort %}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
{# Check key lengths #} | |
{% set actual_keys = actual.keys() | list | sort %} | |
{% set expected_keys = expected.keys() | list | sort %} | |
{% if actual_keys | length != expected_keys | length %} | |
{{ return(false) }} | |
{% endif %} | |
{# Quick length check before detailed comparison #} | |
{% if actual.keys() | length != expected.keys() | length %} | |
{{ return(false) }} | |
{% endif %} | |
{# Get sorted keys for detailed comparison #} | |
{% set actual_keys = actual.keys() | list | sort %} | |
{% set expected_keys = expected.keys() | list | sort %} |
{# Check keys exist and match #} | ||
{% for key in actual_keys %} | ||
{% if key not in expected_keys %} | ||
{{ return(false) }} | ||
{% endif %} | ||
{% endfor %} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Simplify key comparison using sorted lists.
Since both key lists are already sorted, we can compare them directly instead of checking individual key existence.
Consider this optimization:
- {# Check keys exist and match #}
- {% for key in actual_keys %}
- {% if key not in expected_keys %}
+ {# Compare sorted key lists #}
+ {% if actual_keys != expected_keys %}
{{ return(false) }}
- {% endif %}
- {% endfor %}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
{# Check keys exist and match #} | |
{% for key in actual_keys %} | |
{% if key not in expected_keys %} | |
{{ return(false) }} | |
{% endif %} | |
{% endfor %} | |
{# Compare sorted key lists #} | |
{% if actual_keys != expected_keys %} | |
{{ return(false) }} | |
{% endif %} |
No description provided.