|
1 | 1 | import pytest |
2 | 2 | import json |
3 | 3 | import sklearn |
| 4 | +import pins |
| 5 | +import pandas as pd |
| 6 | +import numpy as np |
| 7 | + |
4 | 8 | from pins.boards import BoardRsConnect |
5 | 9 | from pins.rsconnect.api import RsConnectApi |
6 | 10 | from pins.rsconnect.fs import RsConnectFs |
7 | | -from rsconnect.api import RSConnectServer |
| 11 | +from rsconnect.api import RSConnectServer, RSConnectClient |
8 | 12 |
|
9 | 13 | import vetiver |
10 | 14 |
|
11 | | -# Load data, model |
12 | | -X_df, y = vetiver.mock.get_mock_data() |
13 | | -model = vetiver.mock.get_mock_model().fit(X_df, y) |
14 | | - |
15 | 15 | RSC_SERVER_URL = "http://localhost:3939" |
16 | 16 | RSC_KEYS_FNAME = "vetiver/tests/rsconnect_api_keys.json" |
17 | 17 |
|
18 | 18 | pytestmark = pytest.mark.rsc_test # noqa |
19 | 19 |
|
20 | 20 |
|
21 | | -def server_from_key(name): |
| 21 | +def get_key(name): |
22 | 22 | with open(RSC_KEYS_FNAME) as f: |
23 | 23 | api_key = json.load(f)[name] |
24 | | - return RSConnectServer(RSC_SERVER_URL, api_key) |
| 24 | + return api_key |
25 | 25 |
|
26 | 26 |
|
27 | 27 | def rsc_from_key(name): |
@@ -59,27 +59,42 @@ def rsc_short(): |
59 | 59 | rsc_delete_user_content(fs_susan.api) |
60 | 60 |
|
61 | 61 |
|
62 | | -def test_board_pin_write(rsc_short): |
63 | | - v = vetiver.VetiverModel( |
64 | | - model=model, ptype_data=X_df, model_name="susan/model", versioned=None |
65 | | - ) |
66 | | - vetiver.vetiver_pin_write(board=rsc_short, model=v) |
67 | | - assert isinstance(rsc_short.pin_read("susan/model"), sklearn.dummy.DummyRegressor) |
| 62 | +def test_deploy(rsc_short): |
| 63 | + np.random.seed(500) |
68 | 64 |
|
| 65 | + # Load data, model |
| 66 | + X_df, y = vetiver.mock.get_mock_data() |
| 67 | + model = vetiver.mock.get_mock_model().fit(X_df, y) |
69 | 68 |
|
70 | | -@pytest.mark.xfail |
71 | | -def test_deploy(rsc_short): |
72 | | - v = vetiver.VetiverModel( |
73 | | - model=model, ptype_data=X_df, model_name="susan/model", versioned=None |
74 | | - ) |
| 69 | + v = vetiver.VetiverModel(model=model, ptype_data=X_df, model_name="susan/model") |
75 | 70 |
|
76 | | - vetiver.vetiver_pin_write(board=rsc_short, model=v) |
77 | | - connect_server = RSConnectServer( |
78 | | - url=RSC_SERVER_URL, api_key=server_from_key("susan") |
| 71 | + board = pins.board_rsconnect( |
| 72 | + server_url=RSC_SERVER_URL, api_key=get_key("susan"), allow_pickle_read=True |
79 | 73 | ) |
| 74 | + |
| 75 | + vetiver.vetiver_pin_write(board=board, model=v) |
| 76 | + connect_server = RSConnectServer(url=RSC_SERVER_URL, api_key=get_key("susan")) |
| 77 | + assert isinstance(board.pin_read("susan/model"), sklearn.dummy.DummyRegressor) |
| 78 | + |
80 | 79 | vetiver.deploy_rsconnect( |
81 | | - connect_server=connect_server, board=rsc_short, pin_name="susan/model" |
| 80 | + connect_server=connect_server, |
| 81 | + board=board, |
| 82 | + pin_name="susan/model", |
| 83 | + title="testapi", |
| 84 | + extra_files=["requirements.txt"], |
82 | 85 | ) |
83 | | - response = vetiver.predict(RSC_SERVER_URL + "/predict", json=X_df) |
84 | | - assert response.status_code == 200, response.text |
85 | | - assert response.json() == {"prediction": [44.47, 44.47]}, response.json() |
| 86 | + |
| 87 | + # get url of where content lives |
| 88 | + client = RSConnectClient(connect_server) |
| 89 | + dicts = client.content_search() |
| 90 | + rsc_api = list(filter(lambda x: x["title"] == "testapi", dicts)) |
| 91 | + content_url = rsc_api[0].get("content_url") |
| 92 | + |
| 93 | + h = {"Authorization": f'Key {get_key("susan")}'} |
| 94 | + |
| 95 | + endpoint = vetiver.vetiver_endpoint(content_url + "/predict") |
| 96 | + response = vetiver.predict(endpoint, X_df, headers=h) |
| 97 | + |
| 98 | + assert isinstance(response, pd.DataFrame), response |
| 99 | + assert response.iloc[0, 0] == 44.47 |
| 100 | + assert len(response) == 100 |
0 commit comments