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
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
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
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
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
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
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
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' }, ], } }, ], }
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
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
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')
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
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
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
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
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:]
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
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")
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()]) + \ '''}"
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
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
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
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)
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, },
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' } }] }