You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gristlabs_grist-core/sandbox/grist/test_default_formulas.py

130 lines
5.6 KiB

import time
import logging
import testutil
import test_engine
log = logging.getLogger(__name__)
class TestDefaultFormulas(test_engine.EngineTestCase):
sample = testutil.parse_test_sample({
"SCHEMA": [
[1, "Customers", [
[1, "Name", "Text", False, "", "", ""],
[2, "Region", "Ref:Regions", False, "", "", ""],
[3, "RegName", "Text", True, "$Region.Region", "", ""],
[4, "SalesRep", "Text", False, "$Region.Rep", "", ""],
[5, "CID", "Int", False, "$id + 1000", "", ""],
]],
[2, "Regions", [
[11, "Region", "Text", False, "", "", ""],
[12, "Rep", "Text", False, "", "", ""]
]],
],
"DATA": {
"Customers": [
["id","Name", "Region", "SalesRep", "CID"],
[1, "Dolphin", 2, "Neptune", 0 ],
],
"Regions": [
["id", "Region", "Rep"],
[1, "Pacific", "Watatsumi"],
[2, "Atlantic", "Poseidon"],
[3, "Indian", "Neptune"],
[4, "Arctic", "Poseidon"],
],
}
})
def test_default_formula_plain(self):
self.load_sample(self.sample)
# The defaults don't affect data that's loaded
self.assertTableData("Customers", data=[
["id","Name", "Region", "RegName", "SalesRep", "CID" ],
[1, "Dolphin", 2, "Atlantic", "Neptune", 0],
])
# Defaults affect new records
self.add_record("Customers", Name="Shark", Region=2)
self.add_record("Customers", Name="Squid", Region=1)
self.assertTableData("Customers", data=[
["id","Name", "Region", "RegName", "SalesRep", "CID"],
[1, "Dolphin", 2, "Atlantic", "Neptune", 0],
[2, "Shark", 2, "Atlantic", "Poseidon", 1002], # New record
[3, "Squid", 1, "Pacific", "Watatsumi",1003], # New record
])
# Changed defaults don't affect previously-added records
self.modify_column('Customers', 'CID', formula='$id + 2000')
self.add_record("Customers", Name="Hammerhead", Region=3)
self.assertTableData("Customers", data=[
["id","Name", "Region", "RegName", "SalesRep", "CID"],
[1, "Dolphin", 2, "Atlantic", "Neptune", 0],
[2, "Shark", 2, "Atlantic", "Poseidon", 1002],
[3, "Squid", 1, "Pacific", "Watatsumi",1003],
[4, "Hammerhead", 3, "Indian", "Neptune", 2004], # New record
])
# Defaults don't affect changes to existing records
self.update_record("Customers", 2, Region=3)
self.assertTableData("Customers", data=[
["id","Name", "Region", "RegName", "SalesRep", "CID"],
[1, "Dolphin", 2, "Atlantic", "Neptune", 0],
[2, "Shark", 3, "Indian", "Poseidon", 1002], # Region changed
[3, "Squid", 1, "Pacific", "Watatsumi",1003],
[4, "Hammerhead", 3, "Indian", "Neptune", 2004],
])
def test_default_formula_with_lookups(self):
self.load_sample(self.sample)
self.modify_column('Customers', 'RegName', isFormula=False, formula="")
self.modify_column('Customers', 'Region', isFormula=False,
formula="Regions.lookupOne(Region=$RegName)")
self.assertTableData("Customers", data=[
["id","Name", "Region", "RegName", "SalesRep", "CID" ],
[1, "Dolphin", 2, "Atlantic", "Neptune", 0],
])
# Lookup-based defaults work.
self.add_record("Customers", Name="Shark", RegName="Atlantic")
self.add_record("Customers", Name="Squid", RegName="Pacific")
self.assertTableData("Customers", data=[
["id","Name", "Region", "RegName", "SalesRep", "CID"],
[1, "Dolphin", 2, "Atlantic", "Neptune", 0],
[2, "Shark", 2, "Atlantic", "Poseidon", 1002], # New record
[3, "Squid", 1, "Pacific", "Watatsumi",1003], # New record
])
def test_time_defaults(self):
self.load_sample(self.sample)
self.add_column('Customers', 'AddTime',
type="DateTime:America/Los_Angeles", isFormula=False, formula="NOW()")
self.add_column('Customers', 'AddDate',
type="Date", isFormula=False, formula="TODAY()")
self.assertTableData("Customers", data=[
["id","Name", "Region", "RegName", "SalesRep", "CID", "AddTime", "AddDate" ],
[1, "Dolphin", 2, "Atlantic", "Neptune", 0, None, None ],
])
self.add_record("Customers", Name="Shark", Region=2)
self.add_record("Customers", Name="Squid", Region=1)
now = time.time()
midnight = now - (now % (24*60*60))
# Check columns except AddTime, which we check separately below.
self.assertTableData("Customers", cols="subset", data=[
["id","Name", "Region", "RegName", "SalesRep", "CID", "AddDate"],
[1, "Dolphin", 2, "Atlantic", "Neptune", 0, None],
[2, "Shark", 2, "Atlantic", "Poseidon", 1002, midnight], # New record
[3, "Squid", 1, "Pacific", "Watatsumi",1003, midnight], # New record
])
# AddTime column is hard to be precise about, check it separately. Note that the timestamp
# does not depend on timezone, and should not change based on the timezone in the column type.
observed_data = self.engine.fetch_table('Customers')
self.assertEqual(observed_data.columns['AddTime'][0], None)
self.assertLessEqual(abs(observed_data.columns['AddTime'][1] - now), 2)
self.assertLessEqual(abs(observed_data.columns['AddTime'][2] - now), 2)