# 🔍 Description ## Issue References 🔗 This pull request fixes #6281 ## Describe Your Solution 🔧 The change initialize a CI job to run unit testing on python client, including: - Set up Github Action based on docker-compose - Update test cases and test succeeded for dialect `presto` and `trino` - Temporary disabled hive related test due to test cases are not valid, not about connection - Update dev dependencies to support python 3.10 - Speed up testing with `pytest-xdist` plugin ## Types of changes 🔖 - [ ] Bugfix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) ## Test Plan 🧪 #### Behavior Without This Pull Request ⚰️ Not able to ran unit test in local and on CI #### Behavior With This Pull Request 🎉 Able to run and partially cover a couple of test cases #### Related Unit Tests No ## Additional notes Next action is about fixing failing test cases or considering skipping some of them if necessary --- # Checklist 📝 - [ ] This patch was not authored or co-authored using [Generative Tooling](https://www.apache.org/legal/generative-tooling.html) **Be nice. Be informative.** Closes #6343 from sudohainguyen/ci/init. Closes #6281 682e575c4 [Harry] Remove xdist out of scope dc42ca1ff [Harry] Pin pytest packages version 469f1d955 [Harry] Pin ubuntu version 00cef476a [Harry] Use v4 checkout action 96ef83148 [Harry] Remove unnecessary steps 732344a2c [Harry] Add step to tear down containers 1e2c2481a [Harry] Resolved trino and presto test 5b33e3924 [Harry] Make tests runnable 1be033ba3 [Harry] Remove randome flag which causes failed test run 2bc6dc036 [Harry] Switch action setup provider to docker ea2a76319 [Harry] Initialize github action for python unit testing Authored-by: Harry <quanghai.ng1512@gmail.com> Signed-off-by: Cheng Pan <chengpan@apache.org>
98 lines
3.5 KiB
Python
98 lines
3.5 KiB
Python
"""Trino integration tests.
|
|
|
|
These rely on having a Trino+Hadoop cluster set up.
|
|
They also require a tables created by make_test_tables.sh.
|
|
"""
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import unicode_literals
|
|
|
|
import contextlib
|
|
import os
|
|
from decimal import Decimal
|
|
|
|
import requests
|
|
|
|
from pyhive import exc
|
|
from pyhive import trino
|
|
from pyhive.tests.dbapi_test_case import DBAPITestCase
|
|
from pyhive.tests.dbapi_test_case import with_cursor
|
|
from pyhive.tests.test_presto import TestPresto
|
|
import mock
|
|
import unittest
|
|
import datetime
|
|
|
|
_HOST = 'localhost'
|
|
_PORT = '18080'
|
|
|
|
|
|
class TestTrino(TestPresto):
|
|
__test__ = True
|
|
|
|
def connect(self):
|
|
return trino.connect(host=_HOST, port=_PORT, source=self.id())
|
|
|
|
def test_bad_protocol(self):
|
|
self.assertRaisesRegexp(ValueError, 'Protocol must be',
|
|
lambda: trino.connect('localhost', protocol='nonsense').cursor())
|
|
|
|
def test_escape_args(self):
|
|
escaper = trino.TrinoParamEscaper()
|
|
|
|
self.assertEqual(escaper.escape_args((datetime.date(2020, 4, 17),)),
|
|
("date '2020-04-17'",))
|
|
self.assertEqual(escaper.escape_args((datetime.datetime(2020, 4, 17, 12, 0, 0, 123456),)),
|
|
("timestamp '2020-04-17 12:00:00.123'",))
|
|
|
|
@with_cursor
|
|
def test_description(self, cursor):
|
|
cursor.execute('SELECT 1 AS foobar FROM one_row')
|
|
self.assertEqual(cursor.description, [('foobar', 'integer', None, None, None, None, True)])
|
|
self.assertIsNotNone(cursor.last_query_id)
|
|
|
|
@with_cursor
|
|
def test_complex(self, cursor):
|
|
cursor.execute('SELECT * FROM one_row_complex')
|
|
# TODO Trino drops the union field
|
|
|
|
tinyint_type = 'tinyint'
|
|
smallint_type = 'smallint'
|
|
float_type = 'real'
|
|
self.assertEqual(cursor.description, [
|
|
('boolean', 'boolean', None, None, None, None, True),
|
|
('tinyint', tinyint_type, None, None, None, None, True),
|
|
('smallint', smallint_type, None, None, None, None, True),
|
|
('int', 'integer', None, None, None, None, True),
|
|
('bigint', 'bigint', None, None, None, None, True),
|
|
('float', float_type, None, None, None, None, True),
|
|
('double', 'double', None, None, None, None, True),
|
|
('string', 'varchar', None, None, None, None, True),
|
|
('timestamp', 'timestamp', None, None, None, None, True),
|
|
('binary', 'varbinary', None, None, None, None, True),
|
|
('array', 'array(integer)', None, None, None, None, True),
|
|
('map', 'map(integer, integer)', None, None, None, None, True),
|
|
('struct', 'row(a integer, b integer)', None, None, None, None, True),
|
|
# ('union', 'varchar', None, None, None, None, True),
|
|
('decimal', 'decimal(10, 1)', None, None, None, None, True),
|
|
])
|
|
rows = cursor.fetchall()
|
|
expected = [(
|
|
True,
|
|
127,
|
|
32767,
|
|
2147483647,
|
|
9223372036854775807,
|
|
0.5,
|
|
0.25,
|
|
'a string',
|
|
'1970-01-01 00:00:00.000',
|
|
b'123',
|
|
[1, 2],
|
|
{"1": 2, "3": 4}, # Trino converts all keys to strings so that they're valid JSON
|
|
[1, 2], # struct is returned as a list of elements
|
|
# '{0:1}',
|
|
Decimal('0.1'),
|
|
)]
|
|
self.assertEqual(rows, expected)
|
|
# catch unicode/str
|
|
self.assertEqual(list(map(type, rows[0])), list(map(type, expected[0]))) |