def test_is_21_of_ouder(self): fixture = get_fixture() user_data = objectpath.Tree(fixture["data"]) pio_rule = { "1": { "name": "is 66", "rules": [{ "type": "rule", "rule": "dateTime($.brp.persoon.geboortedatum) + timeDelta(21, 0, 0, 0, 0, 0) <= now()" }] } } rules = [{ "type": "rule", "rule": "dateTime($.brp.persoon.geboortedatum) + timeDelta(21, 0, 0, 0, 0, 0) <= now()" }] self.assertTrue(apply_rules(user_data, rules, pio_rule)) fixture["data"]['brp']['persoon'][ 'geboortedatum'] = '2012-01-01T00:00:00Z' user_data = objectpath.Tree(fixture["data"]) self.assertFalse(apply_rules(user_data, rules, pio_rule))
def test_apply_rules_recursing(self): compound_rules = { "1": { "name": "rule 1", "rules": [{ "type": "ref", "ref_id": "2" }] }, "2": { "name": "rule 2", "rules": [{ "type": "ref", "ref_id": "1" }] } } rules = [{"type": "ref", "ref_id": "1"}] with self.assertRaises(RecursionError): apply_rules(self.test_data, rules, compound_rules) # self referencing compound_rules = { "1": { "name": "rule 1", "rules": [{ "type": "ref", "ref_id": "1" }] } } rules = [{"type": "ref", "ref_id": "1"}] with self.assertRaises(RecursionError): apply_rules(self.test_data, rules, compound_rules)
def test_nationaliteit(self): fixture = get_fixture() user_data = objectpath.Tree(fixture["data"]) pio_rule = { "1": { "name": "is 66", "rules": [{ "type": "rule", "rule": "$.brp.persoon.nationaliteiten[@.omschrijving is Nederlandse]" }] } } rules = [{ "type": "rule", "rule": "$.brp.persoon.nationaliteiten[@.omschrijving is Nederlandse]" }] self.assertTrue(apply_rules(user_data, rules, pio_rule)) fixture["data"]['brp']['persoon']["nationaliteiten"][0] = { "omschrijving": "Nederlandse" } user_data = objectpath.Tree(fixture["data"]) self.assertTrue(apply_rules(user_data, rules, pio_rule)) fixture["data"]['brp']['persoon']["nationaliteiten"][0] = { "omschrijving": "Amerikaanse" } user_data = objectpath.Tree(fixture["data"]) self.assertFalse(apply_rules(user_data, rules, pio_rule))
def test_heeft_kinderen(self): fixture = self._get_tips_request_data() user_data = UserDataTree(fixture["user_data"]) rules = [{"type": "ref", "ref_id": "4"}] self.assertTrue(apply_rules(user_data, rules, compound_rules)) fixture["user_data"]["BRP"]["kinderen"] = [] user_data = UserDataTree(fixture["user_data"]) self.assertFalse(apply_rules(user_data, rules, compound_rules))
def test_heeft_kinderen(self): fixture = get_fixture() user_data = objectpath.Tree(fixture["data"]) rules = [{"type": "ref", "ref_id": "4"}] self.assertTrue(apply_rules(user_data, rules, compound_rules)) fixture["data"]['brp']['kinderen'] = [] user_data = objectpath.Tree(fixture["data"]) self.assertFalse(apply_rules(user_data, rules, compound_rules))
def test_woont_in_gemeente_Amsterdam(self): fixture = self._get_tips_request_data() user_data = UserDataTree(fixture["user_data"]) rules = [{"type": "ref", "ref_id": "3"}] self.assertTrue(apply_rules(user_data, rules, compound_rules)) fixture["user_data"]["BRP"]["persoon"]["mokum"] = True user_data = UserDataTree(fixture["user_data"]) self.assertTrue(apply_rules(user_data, rules, compound_rules)) fixture["user_data"]["BRP"]["persoon"]["mokum"] = False user_data = UserDataTree(fixture["user_data"]) self.assertFalse(apply_rules(user_data, rules, compound_rules))
def test_woont_in_gemeente_Amsterdam(self): fixture = get_fixture() user_data = objectpath.Tree(fixture["data"]) rules = [{"type": "ref", "ref_id": "3"}] self.assertTrue(apply_rules(user_data, rules, compound_rules)) fixture["data"]['brp']['persoon']['mokum'] = True user_data = objectpath.Tree(fixture["data"]) self.assertTrue(apply_rules(user_data, rules, compound_rules)) fixture["data"]['brp']['persoon']['mokum'] = False user_data = objectpath.Tree(fixture["data"]) self.assertFalse(apply_rules(user_data, rules, compound_rules))
def test_kind_is_tussen_2_en_18_jaar(self): fixture = get_fixture() user_data = objectpath.Tree(fixture["data"]) rules = [{"type": "ref", "ref_id": "5"}] self.assertFalse(apply_rules(user_data, rules, compound_rules)) fixture["data"]['brp']['kinderen'][0][ 'geboortedatum'] = '2012-01-01T00:00:00Z' user_data = objectpath.Tree(fixture["data"]) self.assertTrue(apply_rules(user_data, rules, compound_rules)) fixture["data"]['brp']['kinderen'][1][ 'geboortedatum'] = '2012-01-01T00:00:00Z' user_data = objectpath.Tree(fixture["data"]) self.assertTrue(apply_rules(user_data, rules, compound_rules))
def test_is_18_of_ouder(self): fixture = get_fixture() user_data = objectpath.Tree(fixture["data"]) rules = [{"type": "ref", "ref_id": "2"}] self.assertTrue(apply_rules(user_data, rules, compound_rules)) fixture["data"]['brp']['persoon'][ 'geboortedatum'] = '2002-01-01T00:00:00Z' user_data = objectpath.Tree(fixture["data"]) self.assertTrue(apply_rules(user_data, rules, compound_rules)) fixture["data"]['brp']['persoon'][ 'geboortedatum'] = '2018-01-01T00:00:00Z' user_data = objectpath.Tree(fixture["data"]) self.assertFalse(apply_rules(user_data, rules, compound_rules))
def tip_filter(tip, userdata_tree, optin: bool = False): """ If tip has a field "rules", the result must be true for it to be included. If tip does not have "rules, it is included. """ # Return early if basic conditions are not met # Don't process personalized tips if optin doesn't match the personalization key of the tip if optin != tip["isPersonalized"]: return False if not tip["active"]: return False today = date.today() if tip.get("dateActiveStart"): date_active_start = datetime.strptime(tip["dateActiveStart"], "%Y-%m-%d").date() if date_active_start > today: return False if tip.get("dateActiveEnd"): date_active_end = datetime.strptime(tip["dateActiveEnd"], "%Y-%m-%d").date() if date_active_end < today: return False # No need to process tips that don't have rules, we can safely show them if "rules" not in tip: return True passed = apply_rules(userdata_tree, tip["rules"], compound_rules) return passed
def test_stadspas(self): # Stadspas rule rules = [{"type": "ref", "ref_id": "1"}] def is_valid(stadspas): user_data = UserDataTree({"FOCUS_AANVRAGEN": [stadspas]}) return apply_rules(user_data, rules, compound_rules) # Use invalid date invalid_date = get_date_years_ago(2) stadspas = { "productTitle": "Stadspas", "steps": [{ "datePublished": invalid_date, "decision": "toekenning" }], } self.assertFalse(is_valid(stadspas)) # Use valid date valid_date = get_date_years_ago(1) stadspas = { "productTitle": "Stadspas", "steps": [{ "datePublished": valid_date, "decision": "toekenning" }], } self.assertTrue(is_valid(stadspas)) # Use invalid decision stadspas = { "productTitle": "Stadspas", "steps": [{ "datePublished": valid_date, "decision": "afwijzing" }], } self.assertFalse(is_valid(stadspas)) # Use invalid productTitle stadspas = { "productTitle": "Bijstandsuitkering", "steps": [{ "datePublished": valid_date, "decision": "toekenning" }], } self.assertFalse(is_valid(stadspas)) # regression test for when there is no stadspas data or malformed stadspas data self.assertFalse(is_valid(None)) self.assertFalse(is_valid({"steps": ["hy"]})) user_data = UserDataTree({"bliep": None}) is_valid_data = apply_rules(user_data, rules, compound_rules) self.assertFalse(is_valid_data)
def test_kind_is_op_30_september_2020_geen_18(self): fixture = get_fixture() user_data = objectpath.Tree(fixture["data"]) rules = [{"type": "ref", "ref_id": "6"}] self.assertTrue(apply_rules(user_data, rules, compound_rules)) fixture["data"]['brp']['kinderen'][0][ 'geboortedatum'] = '2000-01-01T00:00:00Z' user_data = objectpath.Tree(fixture["data"]) self.assertTrue(apply_rules(user_data, rules, compound_rules)) fixture["data"]['brp']['kinderen'][0][ 'geboortedatum'] = '2000-01-01T00:00:00Z' fixture["data"]['brp']['kinderen'][1][ 'geboortedatum'] = '2000-01-01T00:00:00Z' user_data = objectpath.Tree(fixture["data"]) self.assertFalse(apply_rules(user_data, rules, compound_rules))
def test_apply_rules_simple(self): rules = [{"type": "rule", "rule": "2 > 1"}] compound_rules = {} self.assertTrue(apply_rules(self.test_data, rules, compound_rules)) rules = [ { "type": "rule", "rule": "2 > 1" }, { "type": "rule", "rule": "false" }, ] self.assertFalse(apply_rules(self.test_data, rules, compound_rules))
def tip_filter(tip, userdata_tree): """ If tip has a field "rules", the result must be true for it to be included. If tip does not have "rules, it is included. """ if not tip['active']: return False if 'rules' not in tip: return tip passed = apply_rules(userdata_tree, tip["rules"], compound_rules) return passed
def test_list_assertion(self): test_data = objectpath.Tree({ "brp": { "kinderen": [{ "bsn": None, "geboortedatum": "2006-07-08T09:14:58.963Z", "geslachtsaanduiding": "M", "geslachtsnaam": "Kosterijk", "overlijdensdatum": None, "voornamen": "Yassine", "voorvoegselGeslachtsnaam": None }, { "bsn": None, "geboortedatum": "2018-06-04T09:14:58.963Z", "geslachtsaanduiding": "M", "geslachtsnaam": "Kosterijk", "overlijdensdatum": None, "voornamen": "Marwan", "voorvoegselGeslachtsnaam": None }] } }) compound_rules = { "1": { "name": "rule 1", "rules": [{ "type": "rule", "rule": "len($.brp.kinderen[now() - timeDelta(2, 0, 0, 0, 0, 0) >= dateTime(@.geboortedatum) and now() - timeDelta(18, 0, 0, 0, 0, 0) <= dateTime(@.geboortedatum)]) >= 1" }] } } rules = [{"type": "ref", "ref_id": "1"}] self.assertTrue(apply_rules(test_data, rules, compound_rules)) user_data = objectpath.Tree({ "focus": [{ "typeBesluit": "Toekenning", "soortProduct": "Minimafonds", "processtappen": { "beslissing": { "datum": "2020-04-15T00:00:00+02:00" } } }] }) ret5 = user_data.execute( "len($.focus.*[@.soortProduct is 'Minimafonds' and @.typeBesluit is 'Toekenning' and now() - timeDelta(1, 0, 0, 0, 0, 0) <= dateTime(@.processtappen.beslissing.datum)]) >= 1" ) self.assertTrue(ret5)
def test_stadspas(self): fixture = get_fixture() user_data = objectpath.Tree(fixture["data"]) rules = [{ "type": "ref", "ref_id": "1" } # ID 1 is the stadspas rule ] self.assertFalse(apply_rules(user_data, rules, compound_rules)) fixture["data"]['focus'][7]['processtappen']['beslissing'][ 'datum'] = "2020-01-01T03:00:00+02:00" user_data = objectpath.Tree(fixture["data"]) self.assertTrue(apply_rules(user_data, rules, compound_rules)) fixture["data"]['focus'][7]['typeBesluit'] = 'Afwijzing' user_data = objectpath.Tree(fixture["data"]) self.assertFalse(apply_rules(user_data, rules, compound_rules)) fixture["data"]['focus'][7]['soortProduct'] = 'Participatiewet' user_data = objectpath.Tree(fixture["data"]) self.assertFalse(apply_rules(user_data, rules, compound_rules))
def test_apply_rules_nested(self): compound_rules = { "1": { "name": "rule 1", "rules": [{ "type": "rule", "rule": "true" }] }, "2": { "name": "rule 2", "rules": [{ "type": "ref", "ref_id": "1" }] } } rules = [{"type": "ref", "ref_id": "1"}] self.assertTrue(apply_rules(self.test_data, rules, compound_rules)) rules = [{"type": "ref", "ref_id": "1"}] self.assertTrue(apply_rules(self.test_data, rules, compound_rules))
def test_stadspas(self): # Stadspas rule rules = [{"type": "ref", "ref_id": "1"}] def is_valid(stadspas): user_data = UserDataTree({"WPI_STADSPAS": {"aanvragen": [stadspas]}}) return apply_rules(user_data, rules, compound_rules) # Use invalid date invalid_date = get_date_years_ago(2) stadspas = { "about": "Stadspas", "decision": "toekenning", "datePublished": invalid_date, } self.assertFalse(is_valid(stadspas)) # Use valid date valid_date = get_date_years_ago(1) stadspas = { "about": "Stadspas", "datePublished": valid_date, "decision": "toekenning", } self.assertTrue(is_valid(stadspas)) # Use invalid decision stadspas = { "about": "Stadspas", "datePublished": valid_date, "decision": "afwijzing", } self.assertFalse(is_valid(stadspas)) # regression test for when there is no stadspas data or malformed stadspas data self.assertFalse(is_valid(None)) self.assertFalse(is_valid({"steps": ["hy"]})) user_data = UserDataTree({"bliep": None}) is_valid_data = apply_rules(user_data, rules, compound_rules) self.assertFalse(is_valid_data)
def is_valid(stadspas): user_data = UserDataTree({"FOCUS_AANVRAGEN": [stadspas]}) return apply_rules(user_data, rules, compound_rules)
def test_kind_is_10_11_12(self): fixture = get_fixture() user_data = objectpath.Tree(fixture["data"]) pio_rule = { "1": { "name": "kind is 10,11 of 12", "rules": [{ "type": "rule", "rule": "len($.brp.kinderen[now() - timeDelta(10, 0, 0, 0, 0, 0) >= dateTime(@.geboortedatum) and now() - timeDelta(12, 0, 0, 0, 0, 0) <= dateTime(@.geboortedatum)]) >= 1" }] } } rules = [{ "type": "rule", "rule": "len($.brp.kinderen[now() - timeDelta(10, 0, 0, 0, 0, 0) >= dateTime(@.geboortedatum) and now() - timeDelta(13, 0, 0, 0, 0, 0) < dateTime(@.geboortedatum)]) >= 1" }] self.assertFalse(apply_rules(user_data, rules, pio_rule)) fixture["data"]['brp']['kinderen'][0][ 'geboortedatum'] = '2010-01-01T00:00:00Z' fixture["data"]['brp']['kinderen'][1][ 'geboortedatum'] = '2010-01-01T00:00:00Z' user_data = objectpath.Tree(fixture["data"]) self.assertTrue(apply_rules(user_data, rules, pio_rule)) fixture["data"]['brp']['kinderen'][0][ 'geboortedatum'] = '2010-01-01T00:00:00Z' fixture["data"]['brp']['kinderen'][1][ 'geboortedatum'] = '2002-01-01T00:00:00Z' user_data = objectpath.Tree(fixture["data"]) self.assertTrue(apply_rules(user_data, rules, pio_rule)) fixture["data"]['brp']['kinderen'][0][ 'geboortedatum'] = '2009-01-01T00:00:00Z' fixture["data"]['brp']['kinderen'][1][ 'geboortedatum'] = '2009-01-01T00:00:00Z' user_data = objectpath.Tree(fixture["data"]) self.assertTrue(apply_rules(user_data, rules, pio_rule)) fixture["data"]['brp']['kinderen'][0][ 'geboortedatum'] = '2008-01-01T00:00:00Z' fixture["data"]['brp']['kinderen'][1][ 'geboortedatum'] = '2008-01-01T00:00:00Z' user_data = objectpath.Tree(fixture["data"]) self.assertTrue(apply_rules(user_data, rules, pio_rule)) fixture["data"]['brp']['kinderen'][0][ 'geboortedatum'] = '2007-01-01T00:00:00Z' fixture["data"]['brp']['kinderen'][1][ 'geboortedatum'] = '2007-01-01T00:00:00Z' user_data = objectpath.Tree(fixture["data"]) self.assertFalse(apply_rules(user_data, rules, pio_rule)) fixture["data"]['brp']['kinderen'][0][ 'geboortedatum'] = '20011-01-01T00:00:00Z' fixture["data"]['brp']['kinderen'][1][ 'geboortedatum'] = '20011-01-01T00:00:00Z' user_data = objectpath.Tree(fixture["data"]) self.assertFalse(apply_rules(user_data, rules, pio_rule))
def get_result(): user_data = UserDataTree(fixture["user_data"]) return apply_rules(user_data, rules, compound_rules)
def is_valid(stadspas): user_data = UserDataTree({"WPI_STADSPAS": {"aanvragen": [stadspas]}}) return apply_rules(user_data, rules, compound_rules)