"""
from collections import Counter
import itertools
+import json
import logging
import re
from textwrap import dedent
# copy them back into the word table
with CopyBuffer() as copystr:
for k, v in words.items():
- copystr.add('w', k, {'count': v})
+ copystr.add('w', k, json.dumps({'count': v}))
with conn.cursor() as cur:
copystr.copy_out(cur, 'word',
to_delete.append(word)
else:
copystr.add(self.name_processor.get_search_normalized(postcode),
- 'P', {'postcode': postcode})
+ 'P', json.dumps({'postcode': postcode}))
if to_delete:
cur.execute("""DELETE FROM WORD
term = self.name_processor.get_search_normalized(word)
if term:
copystr.add(term, 'S',
- {'word': word, 'class': cls, 'type': typ,
- 'op': oper if oper in ('in', 'near') else None})
+ json.dumps({'word': word, 'class': cls, 'type': typ,
+ 'op': oper if oper in ('in', 'near') else None}))
added += 1
copystr.copy_out(cursor, 'word',
"""
Tests for DB utility functions in db.utils
"""
+import json
+
import pytest
import nominatim.db.utils as db_utils
+class TestCopyBufferJson:
+ TABLE_NAME = 'copytable'
+
+ @pytest.fixture(autouse=True)
+ def setup_test_table(self, table_factory):
+ table_factory(self.TABLE_NAME, 'colA INT, colB JSONB')
+
+
+ def table_rows(self, cursor):
+ cursor.execute('SELECT * FROM ' + self.TABLE_NAME)
+ results = {k: v for k,v in cursor}
+
+ assert len(results) == cursor.rowcount
+
+ return results
+
+
+ def test_json_object(self, temp_db_cursor):
+ with db_utils.CopyBuffer() as buf:
+ buf.add(1, json.dumps({'test': 'value', 'number': 1}))
+
+ buf.copy_out(temp_db_cursor, self.TABLE_NAME)
+
+ assert self.table_rows(temp_db_cursor) == \
+ {1: {'test': 'value', 'number': 1}}
+
+
+ def test_json_object_special_chras(self, temp_db_cursor):
+ with db_utils.CopyBuffer() as buf:
+ buf.add(1, json.dumps({'te\tst': 'va\nlue', 'nu"mber': None}))
+
+ buf.copy_out(temp_db_cursor, self.TABLE_NAME)
+
+ assert self.table_rows(temp_db_cursor) == \
+ {1: {'te\tst': 'va\nlue', 'nu"mber': None}}