def test_parse_simple_arguments_with_modifiers():
    sf = parse_file('''\
        selectors:
          - name: configured_view
            definition:
              method: config.materialized
              value: view
              parents: True
              children: True
              children_depth: 2
    ''')

    assert len(sf.selectors) == 1
    parsed = cli.parse_from_selectors_definition(sf)
    assert len(parsed) == 1
    assert 'configured_view' in parsed
    assert Criteria(
        method=MethodName.Config,
        method_arguments=['materialized'],
        value='view',
        children=True,
        parents=True,
        childrens_parents=False,
        children_depth=2,
        parents_depth=None,
    ) == parsed['configured_view']
def test_parse_union():
    sf = parse_file('''\
        selectors:
            - name: views-or-foos
              definition:
                union:
                  - method: config.materialized
                    value: view
                  - tag: foo
    ''')
    assert len(sf.selectors) == 1
    parsed = cli.parse_from_selectors_definition(sf)
    assert 'views-or-foos' in parsed
    assert Union(
        Criteria(method=MethodName.Config,
                 value='view',
                 method_arguments=['materialized']),
        Criteria(method=MethodName.Tag, value='foo',
                 method_arguments=[])) == parsed['views-or-foos']
def test_parse_union_excluding():
    sf = parse_file('''\
        selectors:
            - name: views-or-foos-not-bars
              definition:
                union:
                  - method: config.materialized
                    value: view
                  - tag: foo
                  - exclude:
                    - tag: bar
    ''')
    assert len(sf.selectors) == 1
    parsed = cli.parse_from_selectors_definition(sf)
    assert 'views-or-foos-not-bars' in parsed
    assert Difference(
        Union(
            Criteria(method=MethodName.Config,
                     value='view',
                     method_arguments=['materialized']),
            Criteria(method=MethodName.Tag, value='foo', method_arguments=[])),
        Criteria(method=MethodName.Tag, value='bar', method_arguments=[]),
    ) == parsed['views-or-foos-not-bars']
def test_parse_simple():
    sf = parse_file('''\
        selectors:
          - name: tagged_foo
            description: Selector for foo-tagged models
            definition:
              tag: foo
    ''')

    assert len(sf.selectors) == 1
    assert sf.selectors[0].description == 'Selector for foo-tagged models'
    parsed = cli.parse_from_selectors_definition(sf)
    assert len(parsed) == 1
    assert 'tagged_foo' in parsed
    assert Criteria(
        method=MethodName.Tag,
        method_arguments=[],
        value='foo',
        children=False,
        parents=False,
        childrens_parents=False,
        children_depth=None,
        parents_depth=None,
    ) == parsed['tagged_foo']
def test_parse_simple_childrens_parents():
    sf = parse_file('''\
        selectors:
          - name: tagged_foo
            definition:
              method: tag
              value: foo
              childrens_parents: True
    ''')

    assert len(sf.selectors) == 1
    parsed = cli.parse_from_selectors_definition(sf)
    assert len(parsed) == 1
    assert 'tagged_foo' in parsed
    assert Criteria(
        method=MethodName.Tag,
        method_arguments=[],
        value='foo',
        children=False,
        parents=False,
        childrens_parents=True,
        children_depth=None,
        parents_depth=None,
    ) == parsed['tagged_foo']
def test_parse_yaml_complex():
    sf = parse_file('''\
        selectors:
            - name: test_name
              definition:
                union:
                - intersection:
                  - tag: foo
                  - tag: bar
                  - union:
                    - package: snowplow
                    - config.materialized: incremental
                - union:
                  - path: "models/snowplow/marketing/custom_events.sql"
                  - fqn: "snowplow.marketing"
                - intersection:
                  - resource_type: seed
                  - package: snowplow
                  - exclude:
                    - country_codes
                    - intersection:
                      - tag: baz
                      - config.materialized: ephemeral
            - name: weeknights
              definition:
                union:
                - tag: nightly
                - tag:weeknights_only
        ''')

    assert len(sf.selectors) == 2
    parsed = cli.parse_from_selectors_definition(sf)
    assert 'test_name' in parsed
    assert 'weeknights' in parsed
    assert Union(
        Criteria(method=MethodName.Tag, value='nightly'),
        Criteria(method=MethodName.Tag, value='weeknights_only'),
    ) == parsed['weeknights']

    assert Union(
        Intersection(
            Criteria(method=MethodName.Tag, value='foo'),
            Criteria(method=MethodName.Tag, value='bar'),
            Union(
                Criteria(method=MethodName.Package, value='snowplow'),
                Criteria(method=MethodName.Config,
                         value='incremental',
                         method_arguments=['materialized']),
            ),
        ),
        Union(
            Criteria(method=MethodName.Path,
                     value="models/snowplow/marketing/custom_events.sql"),
            Criteria(method=MethodName.FQN, value='snowplow.marketing'),
        ),
        Difference(
            Intersection(
                Criteria(method=MethodName.ResourceType, value='seed'),
                Criteria(method=MethodName.Package, value='snowplow'),
            ),
            Union(
                Criteria(method=MethodName.FQN, value='country_codes'),
                Intersection(
                    Criteria(method=MethodName.Tag, value='baz'),
                    Criteria(method=MethodName.Config,
                             value='ephemeral',
                             method_arguments=['materialized']),
                ),
            ),
        ),
    ) == parsed['test_name']