eq(e.error_code, 'AccessDenied')
-def read_graph():
+def build_graph():
+ graph = {}
+ graph['start'] = {
+ 'set': {},
+ 'choices': ['node1']
+ }
+ graph['leaf'] = {
+ 'set': {
+ 'key1': 'value1',
+ 'key2': 'value2'
+ },
+ 'choices': []
+ }
+ graph['node1'] = {
+ 'set': {
+ 'key3': 'value3'
+ },
+ 'choices': ['leaf']
+ }
+ graph['bad_node'] = {
+ 'set': {
+ 'key1': 'value1'
+ },
+ 'choices': ['leaf']
+ }
+ return graph
+
+
+def test_load_graph():
graph_file = open('request_decision_graph.yml', 'r')
- return yaml.safe_load(graph_file)
+ graph = yaml.safe_load(graph_file)
+ graph['start']
+
+
+def test_descend_leaf_node():
+ graph = build_graph()
+ prng = random.Random(1)
+ decision = descend_graph(graph, 'leaf', prng)
+
+ eq(decision['key1'], 'value1')
+ eq(decision['key2'], 'value2')
+ e = assert_raises(KeyError, lambda x: decision[x], 'key3')
+
+def test_descend_node():
+ graph = build_graph()
+ prng = random.Random(1)
+ decision = descend_graph(graph, 'node1', prng)
+ eq(decision['key1'], 'value1')
+ eq(decision['key2'], 'value2')
+ eq(decision['key3'], 'value3')
-def test_assemble_decision():
- graph = read_graph()
+def test_descend_bad_node():
+ graph = build_graph()
prng = random.Random(1)
- decision = assemble_decision(graph, prng)
- decision['path']
- decision['method']
- decision['body']
- decision['headers']
+ assert_raises(KeyError, descend_graph, graph, 'bad_node', prng)
""" Take in a graph describing the possible decision space and a random
number generator and traverse the graph to build a decision
"""
- raise NotImplementedError
+ return descend_graph(decision_graph, 'start', prng)
+
+
+def descend_graph(decision_graph, node_name, prng):
+ """ Given a graph and a particular node in that graph, set the values in
+ the node's "set" list, pick a choice from the "choice" list, and
+ recurse. Finally, return dictionary of values
+ """
+ try:
+ choice = prng.choice(decision_graph[node_name]['choices'])
+ decision = descend_graph(decision_graph, choice, prng)
+ except IndexError:
+ decision = {}
+
+ node = decision_graph[node_name]
+
+ for key in node['set']:
+ if decision.has_key(key):
+ raise KeyError("Node %s tried to set '%s', but that key was already set by a lower node!" %(node_name, key))
+ decision[key] = node['set'][key]
+ return decision
def expand_decision(decision, prng):