Пример #1
0
def test_watch_unsub_with_zinc(mock) -> None:
    # GIVEN
    """
    Args:
        mock:
    """
    envs = {'HAYSTACK_PROVIDER': 'shaystack.providers.ping'}
    mock.return_value = ping._PingGrid
    mime_type = shaystack.MODE_ZINC
    request = HaystackHttpRequest()
    grid = shaystack.Grid(metadata={"close": True,
                                    "watchId": "0123456789ABCDEF"},
                          columns=['id'])
    grid.append({"id": Ref("id1")})
    grid.append({"id": Ref("id2")})
    request.headers["Content-Type"] = mime_type
    request.headers["Accept"] = mime_type
    request.body = shaystack.dump(grid, mode=shaystack.MODE_ZINC)

    # WHEN
    response = shaystack.watch_unsub(envs, request, "dev")

    # THEN
    mock.assert_called_once_with("0123456789ABCDEF", [Ref("id1"), Ref("id2")], True)
    assert response.status_code == 200
    assert response.headers["Content-Type"].startswith(mime_type)
    assert shaystack.parse(response.body, shaystack.MODE_ZINC) is not None
Пример #2
0
def test_his_read_with_range_today(mock) -> None:
    # GIVEN
    """
    Args:
        mock:
    """
    envs = {'HAYSTACK_PROVIDER': 'shaystack.providers.ping'}
    mock.return_value = ping._PingGrid
    mime_type = shaystack.MODE_ZINC
    request = HaystackHttpRequest()
    grid = shaystack.Grid(columns=['id', 'range'])
    grid.append({"id": Ref("1234"), "range": "today"})
    request.headers["Content-Type"] = mime_type
    request.headers["Accept"] = mime_type
    request.body = shaystack.dump(grid, mode=mime_type)

    # WHEN
    response = shaystack.his_read(envs, request, "dev")

    # THEN
    today = datetime.combine(date.today(), datetime.min.time()).replace(tzinfo=get_localzone())
    mock.assert_called_once_with(Ref("1234"),
                                 (today,
                                  today + timedelta(days=1)
                                  ), None)
    assert response.status_code == 200
    assert response.headers["Content-Type"].startswith(mime_type)
    assert shaystack.parse(response.body, mime_type) is not None
Пример #3
0
def test_his_read_with_zinc(mock, no_cache) -> None:
    # GIVEN
    """
    Args:
        mock:
        no_cache:
    """
    envs = {'HAYSTACK_PROVIDER': 'shaystack.providers.ping'}
    mock.return_value = ping._PingGrid
    no_cache.return_value = True
    mime_type = shaystack.MODE_ZINC
    request = HaystackHttpRequest()
    grid = shaystack.Grid(columns={'id': {}})
    grid.append({"id": Ref("1234")})
    request.headers["Content-Type"] = mime_type
    request.headers["Accept"] = mime_type
    request.body = shaystack.dump(grid, mode=mime_type)

    # WHEN
    response = shaystack.his_read(envs, request, "dev")

    # THEN
    mock.assert_called_once_with(Ref("1234"),
                                 (datetime.min.replace(tzinfo=pytz.UTC),
                                  datetime.max.replace(tzinfo=pytz.UTC)), None)
    assert response.status_code == 200
    assert response.headers["Content-Type"].startswith(mime_type)
    assert shaystack.parse(response.body, mime_type) is not None
Пример #4
0
def test_read_with_zinc_and_id(mock) -> None:
    # GIVEN
    """
    Args:
        mock:
    """
    envs = {'HAYSTACK_PROVIDER': 'shaystack.providers.ping'}
    mock.return_value = ping._PingGrid
    mime_type = shaystack.MODE_ZINC
    request = HaystackHttpRequest()
    grid = shaystack.Grid(columns=['id'])
    grid.append({"id": Ref("me")})
    request.headers["Content-Type"] = mime_type
    request.headers["Accept"] = mime_type
    request.body = shaystack.dump(grid, mode=mime_type)

    # WHEN
    response = shaystack.read(envs, request, "dev")

    # THEN
    ids = [Ref("me")]
    mock.assert_called_once_with(0, None, ids, '', None)
    assert response.status_code == 200
    assert response.headers["Content-Type"].startswith(mime_type)
    assert shaystack.parse(response.body, mime_type) is not None
Пример #5
0
def test_watch_poll_with_zinc(mock) -> None:
    # GIVEN
    """
    Args:
        mock:
    """
    envs = {'HAYSTACK_PROVIDER': 'shaystack.providers.ping'}
    mock.return_value = ping._PingGrid
    mime_type = shaystack.MODE_ZINC
    request = HaystackHttpRequest()
    grid: Grid = shaystack.Grid(
        metadata={'watchId': "0123456789ABCDEF",
                  'refresh': MARKER
                  },
        columns=["empty"])
    grid.append({})
    request.headers["Content-Type"] = mime_type
    request.headers["Accept"] = mime_type
    request.body = shaystack.dump(grid, mode=shaystack.MODE_ZINC)

    # WHEN
    response = shaystack.watch_poll(envs, request, "dev")

    # THEN
    mock.assert_called_once_with("0123456789ABCDEF", True)
    assert response.status_code == 200
    assert response.headers["Content-Type"].startswith(mime_type)
    assert shaystack.parse(response.body, shaystack.MODE_ZINC) is not None
Пример #6
0
def test_invoke_action_with_zinc(mock) -> None:
    # GIVEN
    """
    Args:
        mock:
    """
    envs = {'HAYSTACK_PROVIDER': 'shaystack.providers.ping'}
    mock.return_value = ping._PingGrid
    mime_type = shaystack.MODE_ZINC
    request = HaystackHttpRequest()
    grid = shaystack.Grid(metadata={
        'id': Ref('123'),
        'action': 'doIt'
    },
                          columns={
                              'key': {},
                              'value': {}
                          })
    grid.append({'param': 'value'})
    request.headers["Content-Type"] = mime_type
    request.headers["Accept"] = mime_type
    request.body = shaystack.dump(grid, mode=shaystack.MODE_ZINC)

    # WHEN
    response = shaystack.invoke_action(envs, request, "dev")

    # THEN
    mock.assert_called_once_with(Ref("123"), "doIt", {})
    assert response.status_code == 200
    assert response.headers["Content-Type"].startswith(mime_type)
    assert shaystack.parse(response.body, shaystack.MODE_ZINC) is not None
Пример #7
0
def test_his_read_with_range_one_datetime(mock) -> None:
    # GIVEN
    """
    Args:
        mock:
    """
    envs = {'HAYSTACK_PROVIDER': 'shaystack.providers.ping'}
    mock.return_value = ping._PingGrid
    mime_type = shaystack.MODE_ZINC
    request = HaystackHttpRequest()
    grid = shaystack.Grid(columns=['id', 'range'])
    datetime_1 = datetime(2020, 1, 1, 0, 0, 0, tzinfo=pytz.UTC)
    grid.append({"id": Ref("1234"), "range": datetime_1.isoformat()})
    request.headers["Content-Type"] = mime_type
    request.headers["Accept"] = mime_type
    request.body = shaystack.dump(grid, mode=mime_type)

    # WHEN
    response = shaystack.his_read(envs, request, "dev")

    # THEN
    cur_datetime = datetime.combine(datetime_1, datetime.min.time()).replace(tzinfo=pytz.UTC)
    mock.assert_called_once_with(Ref("1234"),
                                 (cur_datetime,
                                  datetime.max.replace(tzinfo=pytz.UTC)
                                  ), None)
    assert response.status_code == 200
    assert response.headers["Content-Type"].startswith(mime_type)
    assert shaystack.parse(response.body, mime_type) is not None
def test_point_write_write_with_zinc(mock) -> None:
    # GIVEN
    """
    Args:
        mock:
    """
    envs = {'HAYSTACK_PROVIDER': 'shaystack.providers.ping'}
    mock.return_value = Grid(version=VER_3_0,
                             columns=["level", "levelDis", "val", "who"])
    mime_type = shaystack.MODE_ZINC
    request = HaystackHttpRequest()
    grid = shaystack.Grid(columns=['id', "level", "val", "who", "duration"])
    grid.append({
        "id": Ref("1234"),
        "level": 1,
        "val": 100.0,
        "who": "PPR",
        "duration": Quantity(1, "min")
    })
    request.headers["Content-Type"] = mime_type
    request.headers["Accept"] = mime_type
    request.body = shaystack.dump(grid, mode=mime_type)

    # WHEN
    response = shaystack.point_write(envs, request, "dev")

    # THEN
    mock.assert_called_once_with(Ref("1234"), 1, 100, "PPR",
                                 Quantity(1, "min"), None)
    assert response.status_code == 200
    assert response.headers["Content-Type"].startswith(mime_type)
    assert shaystack.parse(response.body, mime_type) is not None
Пример #9
0
def test_grid_types_json():
    innergrid = shaystack.Grid(version=shaystack.VER_3_0)
    innergrid.column['comment'] = {}
    innergrid.extend([
        {
            'comment': 'A innergrid',
        },
    ])
    grid = shaystack.Grid(version=shaystack.VER_3_0)
    grid.column['inner'] = {}
    grid.extend(cast(List[Entity], [
        {
            'inner': innergrid,
        },
    ]))
    grid_str = shaystack.dump(grid, mode=shaystack.MODE_JSON)
    grid_json = json.loads(grid_str)
    assert grid_json == {
        'meta': {
            'ver': '3.0'
        },
        'cols': [
            {
                'name': 'inner'
            },
        ],
        'rows': [
            {
                'inner': {
                    'meta': {
                        'ver': '3.0'
                    },
                    'cols': [
                        {
                            'name': 'comment'
                        },
                    ],
                    'rows': [
                        {
                            'comment': 's:A innergrid'
                        },
                    ],
                }
            },
        ],
    }
Пример #10
0
def make_grid_meta(version=shaystack.VER_2_0):
    """
    Args:
        version:
    """
    grid = shaystack.Grid(version=version)
    grid.metadata['aString'] = 'aValue'
    grid.metadata['aNumber'] = 3.14159
    grid.metadata['aNull'] = None
    grid.metadata['aMarker'] = shaystack.MARKER
    grid.metadata['aQuantity'] = shaystack.Quantity(123, 'Hz')
    grid.column['empty'] = {}
    return grid
Пример #11
0
def test_dict_csv_v2():
    try:
        grid = shaystack.Grid(version=shaystack.VER_2_0)
        grid.column['comment'] = {}
        grid.column['value'] = {}
        grid.extend([{
            'comment': 'An empty dict',
            'value': {},
        }])
        shaystack.dump(grid, mode=shaystack.MODE_CSV)
        assert False, 'Project Haystack 2.0 doesn\'t support dict'
    except ValueError:
        pass
Пример #12
0
def test_grid_types_zinc():
    innergrid = shaystack.Grid(version=shaystack.VER_3_0)
    innergrid.column['comment'] = {}
    innergrid.extend([
        {
            'comment': 'A innergrid',
        },
    ])
    grid = shaystack.Grid(version=shaystack.VER_3_0)
    grid.column['inner'] = {}
    grid.extend(cast(List[Entity], [
        {
            'inner': innergrid,
        },
    ]))
    grid_str = shaystack.dump(grid, mode=shaystack.MODE_ZINC)
    assert grid_str == ('ver:"3.0"\n'
                        'inner\n'
                        '<<ver:"3.0"\n'
                        'comment\n'
                        '"A innergrid"\n'
                        '>>\n')
Пример #13
0
def test_list_json_v2():
    try:
        grid = shaystack.Grid(version=shaystack.VER_2_0)
        grid.column['comment'] = {}
        grid.column['value'] = {}
        grid.extend([{
            'comment': 'An empty list',
            'value': [],
        }])
        shaystack.dump(grid, mode=shaystack.MODE_JSON)
        assert False, 'Project Haystack 2.0 doesn\'t support lists'
    except ValueError:
        pass
Пример #14
0
def test_grid_types_trio():
    innergrid = shaystack.Grid(version=shaystack.VER_3_0)
    innergrid.column['comment'] = {}
    innergrid.extend([
        {
            'comment': 'A innergrid',
        },
    ])
    grid = shaystack.Grid(version=shaystack.VER_3_0)
    grid.column['inner'] = {}
    grid.extend(cast(List[Entity], [
        {
            'inner': innergrid,
        },
    ]))
    grid_str = shaystack.dump(grid, mode=shaystack.MODE_TRIO)
    ref_str = textwrap.dedent('''
        inner: Zinc:
          ver:"3.0"
          comment
          "A innergrid"
        '''[1:])
    assert grid_str == ref_str
Пример #15
0
def test_scalar_dict_trio_v3():
    grid = shaystack.Grid(version=shaystack.VER_3_0)
    grid.column['comment'] = {}
    grid.column['value'] = {}
    grid.extend([
        {
            'comment': 'An empty dict',
            'value': {},
        },
        {
            'comment': 'A marker in a dict',
            'value': {
                "marker": shaystack.MARKER
            },
        },
        {
            'comment': 'A references in a dict',
            'value': {
                "ref": shaystack.Ref('a-ref'),
                "ref2": shaystack.Ref('a-ref', 'a value')
            },
        },
        {
            'comment': 'A quantity in a dict',
            'value': {
                "quantity": shaystack.Quantity(500, 'miles')
            },
        },
    ])
    grid_str = shaystack.dump(grid, mode=shaystack.MODE_TRIO)
    # noinspection PyPep8,PyPep8
    ref_str = textwrap.dedent('''
        comment: An empty dict
        value: {}
        ---
        comment: A marker in a dict
        value: {marker:M}
        ---
        comment: A references in a dict
        value: {'''[1:]) + \
              (" ".join([str(k) + ":" + str(v)
                         for k, v in {"ref": "@a-ref", "ref2": "@a-ref"}.items()])
               .replace("ref2:@a-ref", "ref2:@a-ref \"a value\"")) + \
              textwrap.dedent('''
        }
        ---
        comment: A quantity in a dict
        value: {quantity:500miles}
        '''[1:])
    assert grid_str == ref_str
Пример #16
0
def make_col_meta(version=shaystack.VER_2_0):
    """
    Args:
        version:
    """
    grid = shaystack.Grid(version=version)
    col_meta = shaystack.MetadataObject()
    col_meta['aString'] = 'aValue'
    col_meta['aNumber'] = 3.14159
    col_meta['aNull'] = None
    col_meta['aMarker'] = shaystack.MARKER
    col_meta['aQuantity'] = shaystack.Quantity(123, 'Hz')
    grid.column['empty'] = col_meta
    return grid
Пример #17
0
def test_grid_types_csv():
    innergrid = shaystack.Grid(version=shaystack.VER_3_0)
    innergrid.column['comment'] = {}
    innergrid.extend([
        {
            'comment': 'A innergrid',
        },
    ])
    grid = shaystack.Grid(version=shaystack.VER_3_0)
    grid.column['inner'] = {}
    grid.extend(cast(List[Entity], [
        {
            'inner': innergrid,
        },
    ]))
    grid_csv = shaystack.dump(grid, mode=shaystack.MODE_CSV)
    assert list(reader(grid_csv.splitlines()))
    assert grid_csv == '''
inner
"<<ver:""3.0""
comment
""A innergrid""
>>"
'''[1:]
Пример #18
0
def make_simple_grid(version=shaystack.VER_2_0):
    """
    Args:
        version:
    """
    grid = shaystack.Grid(version=version)
    grid.column['firstName'] = {}
    grid.column['bday'] = {}
    grid.extend([
        {
            'firstName': 'Jack',
            'bday': datetime.date(1973, 7, 23),
        },
        {
            'firstName': 'Jill',
            'bday': datetime.date(1975, 11, 15),
        },
    ])
    return grid
Пример #19
0
def test_scalar_dict_zinc_v3():
    grid = shaystack.Grid(version=shaystack.VER_3_0)
    grid.column['comment'] = {}
    grid.column['value'] = {}
    grid.extend([
        {
            'comment': 'An empty dict',
            'value': {},
        },
        {
            'comment': 'A marker in a dict',
            'value': {
                "marker": shaystack.MARKER
            },
        },
        {
            'comment': 'A references in a dict',
            'value': {
                "ref": shaystack.Ref('a-ref'),
                "ref2": shaystack.Ref('a-ref', 'a value')
            },
        },
        {
            'comment': 'A quantity in a dict',
            'value': {
                "quantity": shaystack.Quantity(500, 'miles')
            },
        },
    ])
    grid_str = shaystack.dump(grid, mode=shaystack.MODE_ZINC)
    assert grid_str == ("ver:\"3.0\"\n"
                        "comment,value\n"
                        "\"An empty dict\",{}\n"
                        "\"A marker in a dict\",{marker:M}\n"
                        "\"A references in a dict\",{" + " ".join([
                            str(k) + ":" + str(v) for k, v in {
                                "ref": "@a-ref",
                                "ref2": "@a-ref"
                            }.items()
                        ]).replace("ref2:@a-ref", "ref2:@a-ref \"a value\"") +
                        "}\n"
                        "\"A quantity in a dict\",{quantity:500miles}\n")
Пример #20
0
def test_scalar_dict_csv_v3():
    grid = shaystack.Grid(version=shaystack.VER_3_0)
    grid.column['comment'] = {}
    grid.column['value'] = {}
    grid.extend([
        {
            'comment': 'An empty dict',
            'value': {},
        },
        {
            'comment': 'A marker in a dict',
            'value': {
                "marker": shaystack.MARKER
            },
        },
        {
            'comment': 'A references in a dict',
            'value': {
                "ref": shaystack.Ref('a-ref'),
                "ref2": shaystack.Ref('a-ref', 'a value')
            },
        },
        {
            'comment': 'A quantity in a dict',
            'value': {
                "quantity": shaystack.Quantity(500, 'miles')
            },
        },
    ])
    grid_csv = shaystack.dump(grid, mode=shaystack.MODE_CSV)
    assert list(reader(grid_csv.splitlines()))
    assert grid_csv == u'''comment,value
"An empty dict","{}"
"A marker in a dict","{marker:M}"
"A references in a dict","{''' + \
           " ".join([k + ":" + v
                     for k, v in {'ref': '@a-ref', 'ref2': '@a-ref ""a value""'}.items()]) + \
           '''}"
Пример #21
0
def make_metadata_grid(version=shaystack.VER_2_0):
    """
    Args:
        version:
    """
    grid = shaystack.Grid(version=version)
    grid.metadata['database'] = 'test'
    grid.metadata['dis'] = 'Site Energy Summary'
    grid.column['siteName'] = {'dis': 'Sites'}
    grid.column['val'] = shaystack.MetadataObject()
    grid.column['val']['dis'] = 'Value'
    grid.column['val']['unit'] = 'kW'
    grid.extend([
        {
            'siteName': 'Site 1',
            'val': shaystack.Quantity(356.214, 'kW'),
        },
        {
            'siteName': 'Site 2',
            'val': shaystack.Quantity(463.028, 'kW'),
        },
    ])
    return grid
Пример #22
0
def test_watch_sub_with_zinc(mock):
    # GIVEN
    """
    Args:
        mock:
    """
    envs = {'HAYSTACK_PROVIDER': 'shaystack.providers.ping'}
    mock.return_value = Grid(version=VER_3_0,
                             metadata={
                                 "watchId": "0123456789ABCDEF",
                                 "lease": 1
                             },
                             columns=["empty"])
    mock.return_value.append({})
    mime_type = shaystack.MODE_ZINC
    request = HaystackHttpRequest()
    grid = shaystack.Grid(metadata={
        "watchDis": "myWatch",
        "watchId": "myid",
        "lease": 1
    },
                          columns=['id'])
    grid.append({"id": Ref("id1")})
    grid.append({"id": Ref("id2")})
    request.headers["Content-Type"] = mime_type
    request.headers["Accept"] = mime_type
    request.body = shaystack.dump(grid, mode=shaystack.MODE_ZINC)

    # WHEN
    response = shaystack.watch_sub(envs, request, "dev")

    # THEN
    mock.assert_called_once_with("myWatch", "myid",
                                 [Ref("id1"), Ref("id2")], 1)
    assert response.status_code == 200
    assert response.headers["Content-Type"].startswith(mime_type)
    assert shaystack.parse(response.body, shaystack.MODE_ZINC) is not None
Пример #23
0
def test_nav_with_zinc(mock):
    # GIVEN
    """
    Args:
        mock:
    """
    envs = {'HAYSTACK_PROVIDER': 'shaystack.providers.ping'}
    mock.return_value = ping._PingGrid
    mime_type = shaystack.MODE_ZINC
    request = HaystackHttpRequest()
    grid: Grid = shaystack.Grid(columns=['navId'])
    grid.append({"navId": "01235456789ABCDEF", "limit": 1})
    request.headers["Content-Type"] = mime_type
    request.headers["Accept"] = mime_type
    request.body = shaystack.dump(grid, mode=shaystack.MODE_ZINC)

    # WHEN
    response = shaystack.nav(envs, request, "dev")

    # THEN
    mock.assert_called_once_with("01235456789ABCDEF")
    assert response.status_code == 200
    assert response.headers["Content-Type"].startswith(mime_type)
    assert shaystack.parse(response.body, shaystack.MODE_ZINC) is not None
Пример #24
0
def test_read_with_zinc_and_filter(mock) -> None:
    # GIVEN
    """
    Args:
        mock:
    """
    envs = {'HAYSTACK_PROVIDER': 'shaystack.providers.ping'}
    mock.return_value = ping._PingGrid
    mime_type = shaystack.MODE_ZINC
    request = HaystackHttpRequest()
    grid = shaystack.Grid(columns={'filter': {}, "limit": {}})
    grid.append({"filter": "id==@me", "limit": 1})
    request.headers["Content-Type"] = mime_type
    request.headers["Accept"] = mime_type
    request.body = shaystack.dump(grid, mode=shaystack.MODE_ZINC)

    # WHEN
    response = shaystack.read(envs, request, "dev")

    # THEN
    mock.assert_called_once_with(1, None, None, 'id==@me', None)
    assert response.status_code == 200
    assert response.headers["Content-Type"].startswith(mime_type)
    assert not shaystack.parse(response.body, mime_type)
Пример #25
0
import shaystack
from shaystack import dump_scalar, MODE_TRIO, MODE_ZINC, MODE_CSV, Entity
from .test_parser import SIMPLE_EXAMPLE_ZINC, SIMPLE_EXAMPLE_JSON, \
    METADATA_EXAMPLE_JSON, SIMPLE_EXAMPLE_CSV, METADATA_EXAMPLE_CSV, SIMPLE_EXAMPLE_TRIO

# The metadata example is a little different, as we generate the grid without
# spaces around the commas.
METADATA_EXAMPLE = '''
ver:"2.0" database:"test" dis:"Site Energy Summary"
siteName dis:"Sites",val dis:"Value" unit:"kW"
"Site 1",356.214kW
"Site 2",463.028kW
'''[1:]

grid_full_types = shaystack.Grid(version=shaystack.VER_2_0)
grid_full_types.column['comment'] = {}
grid_full_types.column['value'] = {}
grid_full_types.extend([
    {
        'comment': 'A null value',
        'value': None,
    },
    {
        'comment': 'A marker',
        'value': shaystack.MARKER,
    },
    {
        'comment': 'A "remove" object',
        'value': shaystack.REMOVE,
    },
Пример #26
0
def test_scalar_dict_json_v3():
    grid = shaystack.Grid(version=shaystack.VER_3_0)
    grid.column['comment'] = {}
    grid.column['value'] = {}
    grid.extend([
        {
            'comment': 'An empty dict',
            'value': {},
        },
        {
            'comment': 'A marker in a dict',
            'value': {
                "marker": shaystack.MARKER
            },
        },
        {
            'comment': 'A references in a dict',
            'value': {
                "ref": shaystack.Ref('a-ref'),
                "ref2": shaystack.Ref('a-ref', 'a value')
            },
        },
        {
            'comment': 'A quantity in a dict',
            'value': {
                "quantity": shaystack.Quantity(500, 'miles')
            },
        },
    ])
    grid_json = json.loads(shaystack.dump(grid, mode=shaystack.MODE_JSON))
    assert grid_json == {
        'meta': {
            'ver': '3.0'
        },
        'cols': [
            {
                'name': 'comment'
            },
            {
                'name': 'value'
            },
        ],
        'rows': [{
            'comment': "s:An empty dict",
            'value': {}
        }, {
            'comment': "s:A marker in a dict",
            'value': {
                'marker': 'm:'
            }
        }, {
            'comment': "s:A references in a dict",
            'value': {
                'ref': 'r:a-ref',
                'ref2': 'r:a-ref a value'
            }
        }, {
            'comment': "s:A quantity in a dict",
            'value': {
                "quantity": 'n:500.000000 miles'
            }
        }]
    }