def test_no_matches_rest(query_dict): port = helper.random_port() with Flow( protocol='http', port=port, including_default_value_fields=True, ).add(uses=MockExecutor): # temporarily adding sleep time.sleep(0.5) query = json.dumps(query_dict).encode('utf-8') req = request.Request( f'http://localhost:{port}/search', data=query, headers={'content-type': 'application/json'}, ) resp = request.urlopen(req).read().decode('utf8') doc = json.loads(resp)['data'][0] assert len(Document.from_dict(doc).matches) == 0 assert Document.from_dict(doc).tags['tag'] == 'test'
def test_crud(tmpdir, rest): os.environ['RESTFUL'] = 'http' if rest else 'grpc' os.environ['WORKSPACE'] = str(tmpdir) with Flow.load_config('flow.yml') as f: c = Client(port=f.port, return_responses=True) original_docs = list(random_docs(10, chunks_per_doc=0)) if rest: rest_post(f, 'index', original_docs) else: c.post( on='/index', inputs=original_docs, ) with Flow.load_config('flow.yml') as f: c = Client(port=f.port, return_responses=True) inputs = list(random_docs(1)) if rest: results = rest_post(f, 'search', inputs) matches = results['data'][0]['matches'] for doc in results['data']: assert Document.from_dict(doc).text == 'hello world' else: results = c.post(on='/search', inputs=inputs, parameters=PARAMS) matches = results[0].docs[0].matches for doc in results[0].docs: assert doc.text == 'hello world' assert len(matches) == 10 with Flow.load_config('flow.yml') as f: c = Client(port=f.port, return_responses=True) inputs = list(random_docs(5, chunks_per_doc=0)) if rest: rest_post(f, 'delete', inputs) else: c.post(on='/delete', inputs=inputs) with Flow.load_config('flow.yml') as f: c = Client(port=f.port, return_responses=True) inputs = list(random_docs(1)) if rest: results = rest_post(f, 'search', inputs) matches = results['data'][0]['matches'] else: results = c.post(on='/search', inputs=inputs, parameters=PARAMS) matches = results[0].docs[0].matches assert len(matches) == 5 updated_docs = list( random_docs(5, chunks_per_doc=5, start_id=5, text='hello again') ) with Flow.load_config('flow.yml') as f: c = Client(port=f.port, return_responses=True) if rest: rest_post(f, 'update', updated_docs) else: c.post(on='/update', inputs=updated_docs) with Flow.load_config('flow.yml') as f: c = Client(port=f.port, return_responses=True) inputs = list(random_docs(1)) if rest: results = rest_post(f, 'search', inputs) matches = sorted( results['data'][0]['matches'], key=lambda match: match['id'] ) else: results = c.post(on='/search', inputs=inputs, parameters=PARAMS) matches = sorted(results[0].docs[0].matches, key=lambda match: match.id) assert len(matches) == 5 for match, updated_doc in zip(matches, updated_docs): if isinstance(match, dict): match = Document.from_dict(match) assert updated_doc.id == match.id assert updated_doc.text == match.text np.testing.assert_array_equal(updated_doc.embedding, match.embedding) assert len(match.chunks) == 5 assert len(match.chunks) == len(updated_doc.chunks) for match_chunk, updated_doc_chunk in zip(match.chunks, updated_doc.chunks): assert match_chunk.text == updated_doc_chunk.text np.testing.assert_array_equal( match_chunk.embedding, updated_doc_chunk.embedding )