Files
2025-05-20 09:24:29 -04:00

133 lines
5.2 KiB
Python

# -*- coding: utf-8 -*-
"""Test collations
These tests require that the locale fr_FR.utf8 (or equivalent) be installed.
"""
import sys
import pytest
from pyrseas.testutils import DatabaseToMapTestCase
from pyrseas.testutils import InputMapToSqlTestCase, fix_indent
if sys.platform == 'win32':
COLL = 'French_France.1252'
else:
COLL = 'fr_FR.UTF-8'
CREATE_STMT = "CREATE COLLATION sd.c1 (LC_COLLATE = '%s', LC_CTYPE = '%s')" % (
COLL, COLL)
COMMENT_STMT = "COMMENT ON COLLATION sd.c1 IS 'Test collation c1'"
class CollationToMapTestCase(DatabaseToMapTestCase):
"""Test mapping of existing collations"""
def test_map_collation1(self):
"Map a collation"
dbmap = self.to_map([CREATE_STMT])
expmap = {'lc_collate': COLL, 'lc_ctype': COLL}
assert dbmap['schema sd']['collation c1'] == expmap
def test_map_collation_comment(self):
"Map a collation comment"
dbmap = self.to_map([CREATE_STMT, COMMENT_STMT])
assert dbmap['schema sd']['collation c1']['description'] == \
'Test collation c1'
def test_map_column_collation(self):
"Map a table with a column collation"
dbmap = self.to_map(
[CREATE_STMT, "CREATE TABLE t1 (c1 integer, c2 text COLLATE c1)"])
expmap = {'columns': [{'c1': {'type': 'integer'}},
{'c2': {'type': 'text', 'collation': 'c1'}}],
'depends_on': ['collation c1']}
assert dbmap['schema sd']['table t1'] == expmap
def test_map_index_collation(self):
"Map an index with column collation"
stmts = [CREATE_STMT, "CREATE TABLE t1 (c1 integer, c2 text)",
"CREATE INDEX t1_idx ON t1 (c2 COLLATE c1)"]
dbmap = self.to_map(stmts)
expmap = {'columns': [{'c1': {'type': 'integer'}},
{'c2': {'type': 'text'}}],
'indexes': {'t1_idx': {
'keys': [{'c2': {'collation': 'sd.c1'}}],
'depends_on': ['collation c1']}}}
assert dbmap['schema sd']['table t1'] == expmap
class CollationToSqlTestCase(InputMapToSqlTestCase):
"""Test SQL generation from input collations"""
def test_create_collation1(self):
"Create a collation"
inmap = self.std_map()
inmap['schema sd'].update({'collation c1': {
'lc_collate': COLL, 'lc_ctype': COLL}})
sql = self.to_sql(inmap)
assert fix_indent(sql[0]) == CREATE_STMT
def test_create_collation_schema(self):
"Create a collation in a non-default schema"
inmap = self.std_map()
inmap.update({'schema s1': {'collation c1': {
'lc_collate': COLL, 'lc_ctype': COLL}}})
sql = self.to_sql(inmap, ["CREATE SCHEMA s1"])
assert fix_indent(sql[0]) == "CREATE COLLATION s1.c1 (" \
"LC_COLLATE = '%s', LC_CTYPE = '%s')" % (COLL, COLL)
def test_bad_collation_map(self):
"Error creating a collation with a bad map"
inmap = self.std_map()
inmap['schema sd'].update({'c1': {
'lc_collate': COLL, 'lc_ctype': COLL}})
with pytest.raises(KeyError):
self.to_sql(inmap)
def test_drop_collation(self):
"Drop an existing collation"
sql = self.to_sql(self.std_map(), [CREATE_STMT])
assert sql[0] == "DROP COLLATION sd.c1"
def test_collation_with_comment(self):
"Create a collation with a comment"
inmap = self.std_map()
inmap['schema sd'].update({'collation c1': {
'description': 'Test collation c1',
'lc_collate': COLL, 'lc_ctype': COLL}})
sql = self.to_sql(inmap)
assert fix_indent(sql[0]) == CREATE_STMT
assert sql[1] == COMMENT_STMT
def test_create_table_column_collation(self):
"Create a table with a column with non-default collation"
inmap = self.std_map()
inmap['schema sd'].update({'table t1': {
'columns': [{'c1': {'type': 'integer', 'not_null': True}},
{'c2': {'type': 'text', 'collation': 'c1'}}]}})
sql = self.to_sql(inmap)
assert fix_indent(sql[0]) == "CREATE TABLE sd.t1 (" \
'c1 integer NOT NULL, c2 text COLLATE "c1")'
def test_create_index_collation(self):
"Create an index with column collation"
stmts = [CREATE_STMT, "CREATE TABLE t1 (c1 integer, c2 text)"]
inmap = self.std_map()
inmap['schema sd'].update({'table t1': {
'columns': [{'c1': {'type': 'integer'}}, {'c2': {'type': 'text'}}],
'indexes': {'t1_idx': {'keys': [{'c2': {'collation': 'c1'}}]}}}})
sql = self.to_sql(inmap, stmts)
assert fix_indent(sql[0]) == \
"CREATE INDEX t1_idx ON sd.t1 (c2 COLLATE c1)"
def test_create_type_attribute_collation(self):
"Create a composite type with an attribute with non-default collation"
inmap = self.std_map()
inmap['schema sd'].update({'type t1': {
'attributes': [{'x': {'type': 'integer'}},
{'y': {'type': 'text', 'collation': 'c1'}}]}})
sql = self.to_sql(inmap)
assert fix_indent(sql[0]) == "CREATE TYPE sd.t1 AS (x integer, " \
'y text COLLATE "c1")'