class PutEltsTest(TestCase): def setUp(self): self.manager = GraphManager(data_scope='graph_test') def tearDown(self): self.manager.del_elts() def test_put_elts(self): """ Test put elts method. """ vertice = Vertice() def assertVertice(): """ Assert vertice exists in DB """ # get vertice _vertice = self.manager.get_elts(ids=vertice.id) # check ids self.assertEqual(_vertice.id, vertice.id) # delete vertice self.manager.del_elts() self.manager.put_elts(elts=vertice) assertVertice() self.manager.put_elts(elts=vertice.to_dict()) assertVertice() self.manager.put_elts(elts=[vertice]) assertVertice() self.manager.put_elts(elts=[vertice.to_dict()]) assertVertice()
class GraphElementTest(TestCase): """ Test graph element. """ __COUNT__ = 10 #: number of graph elements to create def get_type(self): """ Get graph element type. """ return GraphElement def get_params(self): """ Get graph element kwargs. """ return {} def setUp(self): """ Create count graph elements and a manager """ self.count = self.__COUNT__ self.elts = [None] * self.count self.manager = GraphManager(data_scope='test_graph') self.manager.del_elts() for i in range(self.count): params = self.get_params() self.elts[i] = self.get_type()(**params) self.elt_ids = [elt.id for elt in self.elts] def tearDown(self): """ Delete all managers. """ for elt in self.elts: elt.delete(manager=self.manager) self.manager.del_elts() def test_init(self): """ Test initialization """ # test unique ids self.assertEqual(len(set(self.elt_ids)), self.count) # test same types self.assertEqual(len(set(elt.type for elt in self.elts)), 1) # change ids and types for index, elt in enumerate(self.elts): elt.id, elt.type = '0', index # test same ids self.assertEqual(len(set(elt.id for elt in self.elts)), 1) # test different types self.assertEqual(len(set(elt.type for elt in self.elts)), self.count) def test_save(self): """ Test to save elements. """ # ensure generated elements are not in the manager elts = self.manager.get_elts(ids=self.elt_ids) self.assertFalse(elts) # save all managers for elt in self.elts: elt.save(manager=self.manager) # ensure all can be retrieved elts = self.manager.get_elts(ids=self.elt_ids) self.assertEqual(len(elts), self.count) def test_delete(self): # ensure generated elements are not in the manager elts = self.manager.get_elts(ids=self.elt_ids) self.assertFalse(elts) # save all managers for elt in self.elts: elt.save(manager=self.manager) # ensure generated elements are in the manager elts = self.manager.get_elts(ids=self.elt_ids) self.assertEqual(len(elts), len(self.elts)) for elt in self.elts: elt.delete(manager=self.manager) # ensure generated elements are not in the manager elts = self.manager.get_elts(ids=self.elt_ids) self.assertFalse(elts) def test_resolve_refs(self): """ Test resolve_refs. """ pass def test_serialization(self): """ Test serializations """ # assert serialization are ok for elt in self.elts: elt_dict = elt.to_dict() new_elt = elt.new(**elt_dict) self.assertEqual(new_elt, elt) new_elt_dict = new_elt.to_dict() self.assertEqual(elt_dict, new_elt_dict)
class GraphTest(TestCase): def setUp(self): """ Create self.count=10 and self.graphs """ self.manager = GraphManager(data_scope='test_graph') self.manager.del_elts() self.count = 10 self.graphs = [None] * 10 self.types = (i for i in range(self.count)) # create self.count vertices self.vertices = [None] * self.count for index in range(self.count): self.vertices[index] = Vertice( id='vertice-{0}'.format(index), info=None if index % 2 else {'index': index}, type='tvertice-{0}'.format(index), ) self.vertice_ids = [vertice.id for vertice in self.vertices] self.vertice_types = [vertice.type for vertice in self.vertices] # create self.count edges self.edges = [None] * self.count for index in range(self.count): self.edges[index] = Edge( id='edge-{0}'.format(index), info=None if index % 2 else {'index': index}, type='tedge-{0}'.format(index), sources=self.vertice_ids[index:], targets=self.vertice_ids[:-index], directed=index % 2 == 0 ) self.edge_ids = [edge.id for edge in self.edges] self.edge_types = [edge.type for edge in self.edges] # create self.count graphs self.graphs = [None] * self.count for index in range(self.count): self.graphs[index] = Graph( id='graph-{0}'.format(index), info=None if index % 2 else {'index': index}, type='tgraph-{0}'.format(index), elts=self.edge_ids[index:] + self.vertice_ids[index:] ) self.graph_ids = [graph.id for graph in self.graphs] self.graph_types = [graph.type for graph in self.graphs] # get all elt ids self.elt_ids = self.graph_ids + self.vertice_ids + self.edge_ids # get all elts self.elts = self.vertices + self.edges + self.graphs # add edges and graphs in edges for index in range(self.count): edge = self.edges[index] edge.sources += self.edge_ids[index:] + self.graph_ids[index:] edge.targets += self.edge_ids[index:] + self.graph_ids[index:] # add graph_ids in graph for index in range(self.count): self.graphs[index].elts += self.graph_ids[index:] # ensure DB is empty self.manager.del_elts() elts = self.manager.get_elts() self.assertFalse(elts) # put vertices in DB for vertice in self.vertices: self.manager.put_elt(elt=vertice) # put edges in DB for edge in self.edges: self.manager.put_elt(elt=edge) # put graphs in DB for graph in self.graphs: self.manager.put_elt(elt=graph) def tearDown(self): """ Del all elements """ self.manager.del_elts() def test_get_elts(self): """ Test to put graph and get them back """ self.manager.del_elts() # ensure no element exist in storage vertices = self.manager.get_elts(ids=self.vertice_ids) self.assertFalse(vertices) edges = self.manager.get_elts(ids=self.edge_ids) self.assertFalse(edges) graphs = self.manager.get_elts(ids=self.graph_ids) self.assertFalse(graphs) # put all elements for vertice in self.vertices: self.manager.put_elt(elt=vertice) for edge in self.edges: self.manager.put_elt(elt=edge) for graph in self.graphs: self.manager.put_elt(elt=graph) # ensure to get all elements vertices = self.manager.get_elts(ids=self.vertice_ids) self.assertEqual(len(vertices), self.count) edges = self.manager.get_elts(ids=self.edge_ids) self.assertEqual(len(edges), self.count) graphs = self.manager.get_elts(ids=self.graph_ids) self.assertEqual(len(graphs), self.count) # check for get all elts elts = self.manager.get_elts() self.assertEqual(len(elts), 3 * self.count) # check to get elements by graph ids elts = self.manager.get_elts(graph_ids=self.graph_ids) self.assertEqual(len(elts), 3 * self.count) # check to get no elements by graph ids where ids does not exist elts = self.manager.get_elts(ids='', graph_ids=self.graph_ids) self.assertFalse(elts) # check to get elements by ids and graph ids for graph in self.graphs: elts = self.manager.get_elts(graph_ids=graph.id) self.assertEqual(len(elts), len(graph.elts)) # check to get one element from graph_ids last_vertice_id = self.vertice_ids[-1] vertice = self.manager.get_elts( ids=last_vertice_id, graph_ids=self.graph_ids ) self.assertTrue(isinstance(vertice, Vertice)) # check get info for elt in self.elts: _elt = self.manager.get_elts(ids=elt.id, info=elt.info) self.assertIsNotNone(_elt) self.assertEqual(_elt.id, elt.id) if elt.info is not None: elts = self.manager.get_elts(info=elt.info) self.assertEqual(len(elts), 3) def test_get_edges(self): """ Test GraphManager.get_edges. """ # check get all edges edges = set(self.manager.get_edges()) self.assertEqual(edges, set(self.edges)) # check get all self edges edges = set(self.manager.get_edges(ids=self.edge_ids)) self.assertEqual(edges, set(self.edges)) # check get one edge for edge_id in self.edge_ids: edge = self.manager.get_edges(ids=edge_id) self.assertIn(edge, set(self.edges)) # check get edge types edges = set(self.manager.get_edges(types=self.edge_types)) self.assertEqual(edges, set(self.edges)) # check to get one edge type for edge_type in self.edge_types: edges = self.manager.get_edges(types=edge_type) self.assertEqual(len(edges), 1) # check get edges by sources edges = set(self.manager.get_edges(sources=self.elt_ids)) self.assertEqual(edges, set(self.edges)) # check get edges by source for edge in self.edges: sources = set(edge.sources) edges = set() for _edge in self.edges: _sources = set(_edge.sources) if sources & _sources: edges.add(_edge) _edges = set(self.manager.get_edges(sources=list(sources))) self.assertEqual(_edges, edges) # check get edges by targets edges = set(self.manager.get_edges(targets=self.elt_ids)) self.assertEqual(edges, set(self.edges)) # check get edges by target for edge in self.edges: targets = set(edge.targets) edges = set() for _edge in self.edges: _targets = set(_edge.targets) if targets & _targets: edges.add(_edge) _edges = set(self.manager.get_edges(targets=list(targets))) self.assertEqual(_edges, edges) def test_get_vertices(self): """ Test GraphManager.get_vertices. """ # check get all edges vertices = set(self.manager.get_vertices()) self.assertEqual(vertices, set(self.vertices)) # check get all self vertices vertices = set(self.manager.get_vertices(ids=self.vertice_ids)) self.assertEqual(vertices, set(self.vertices)) # check get one vertice for vertice_id in self.vertice_ids: vertice = self.manager.get_vertices(ids=vertice_id) self.assertIn(vertice, set(self.vertices)) # check get vertice types vertices = set(self.manager.get_vertices(types=self.vertice_types)) self.assertEqual(vertices, set(self.vertices)) # check to get one vertice type for vertice_type in self.vertice_types: vertices = self.manager.get_vertices(types=vertice_type) self.assertEqual(len(vertices), 1) def test_get_graphs(self): """ Test GraphManager.get_graphs """ # check get all graphs graphs = set(self.manager.get_graphs()) self.assertEqual(graphs, set(self.graphs)) # check get all self graphs graphs = set(self.manager.get_graphs(ids=self.graph_ids)) self.assertEqual(graphs, set(self.graphs)) # check get one graph for graph_id in self.graph_ids: graph = self.manager.get_graphs(ids=graph_id) self.assertIn(graph, self.graphs) # check gelts for graph in self.graphs: graph_elts = graph.elts graph = self.manager.get_graphs(ids=graph.id, add_elts=True) self.assertEqual(len(graph_elts), len(graph._gelts)) # check get graph types graphs = set(self.manager.get_graphs(types=self.graph_types)) self.assertEqual(graphs, set(self.graphs)) # check to get one graph type for graph_type in self.graph_types: graphs = self.manager.get_graphs(types=graph_type) self.assertEqual(len(graphs), 1) # check get graphs by elts graphs = set(self.manager.get_graphs(elts=self.elt_ids)) self.assertEqual(graphs, set(self.graphs)) # check get graphs by one vertice for index, vertice_id in enumerate(self.vertice_ids): graphs = self.manager.get_graphs(elts=vertice_id) self.assertEqual(len(graphs), index + 1) # check get graphs by one edge for index, edge_id in enumerate(self.edge_ids): graphs = self.manager.get_graphs(elts=edge_id) self.assertEqual(len(graphs), index + 1) # check get graphs by one graph for index, graph_id in enumerate(self.graph_ids): graphs = self.manager.get_graphs(elts=graph_id) self.assertEqual(len(graphs), index + 1) # check remove one elt for index, graph_id in enumerate(self.graph_ids): graph = self.manager.get_graphs(ids=graph_id) graph_elts = graph.elts if graph_elts: first_elt = graph.elts[0] self.manager.remove_elts(ids=first_elt, graph_ids=graph.id) graph = self.manager.get_graphs(ids=graph_id) self.assertEqual(len(graph.elts), len(graph_elts) - 1) if len(graph.elts) > 1: # check remove two elts self.manager.remove_elts(ids=graph.elts[:2]) graph = self.manager.get_graphs(ids=graph_id) self.assertEqual(len(graph.elts), len(graph_elts) - 3) # check remove one elt from multiple graphs for index in range(len(self.graph_ids)): # get first "index" graph graph_ids = self.graph_ids[:index] graphs = self.manager.get_graphs(ids=graph_ids) graph_elts = graph.elts elt_id = self.vertice_ids[-1] self.manager.remove_elts(ids=elt_id, graph_ids=graph_ids) graphs = self.manager.get_graphs(ids=graph_ids) for graph in graphs: self.assertNotIn(elt_id, graph.elts) def test_get_neighbourhood(self): """ Test get_neighbourhood method. """ # test empty result neighbourhood = self.manager.get_neighbourhood(ids='') self.assertFalse(neighbourhood) # test all vertices neighbourhood = set(self.manager.get_neighbourhood()) self.assertEqual(len(neighbourhood), len(self.elts)) # let's play with few vertices, edges and graphs v0, v1, v2 = Vertice(type='0'), Vertice(type='1'), Vertice(type='2') e0, e1, e2 = Edge(type='0'), Edge(type='1'), Edge(type='2') g0, g1, g2 = Graph(type='0'), Graph(type='1'), Graph(type='2') # connect v0 to v1 e0.directed = True e0.sources = [v0.id, v1.id, v2.id] e0.targets = [g0.id, g1.id, g2.id] # save all elements v0.save(self.manager), v1.save(self.manager), v2.save(self.manager) e0.save(self.manager), e1.save(self.manager), e2.save(self.manager) g0.save(self.manager), g1.save(self.manager), g2.save(self.manager) # test ids neighbourhood = set(self.manager.get_neighbourhood(ids=v0.id)) self.assertEqual(neighbourhood, {g0, g1, g2}) # test sources neighbourhood = set(self.manager.get_neighbourhood( ids=v0.id, sources=True)) self.assertEqual(neighbourhood, {g0, g1, g2, v0, v1, v2}) # test not targets neighbourhood = set(self.manager.get_neighbourhood( ids=v0.id, targets=False)) self.assertEqual(neighbourhood, set()) # test not directed e0.directed = False e0.save(self.manager) neighbourhood = set(self.manager.get_neighbourhood( ids=v0.id)) self.assertEqual(neighbourhood, {g0, g1, g2, v0, v1, v2}) # test info # test source_data # test target_data # test types # test source_types # test target_types # test edge_ids # test edge_types # test add_edges # test source_edge_types # test target_edge_types # test query # test edge_query # test source_query # test target_query def test_orphans(self): """ Test get orphans method. """ # check if no orphans exist orphans = self.manager.get_orphans() self.assertFalse(orphans) # generate self.count vertices and edges [Vertice().save(self.manager) for i in range(self.count)] [Edge().save(self.manager) for i in range(self.count)] # check if previous vertices and edges are orphans orphans = self.manager.get_orphans() self.assertEqual(len(orphans), 2 * self.count) # create a graph and add orphans to the graph graph = Graph() graph.add_elts(orphans) graph.save(manager=self.manager) # check if only the graph is an orphan orphans = self.manager.get_orphans() self.assertEqual(len(orphans), 1) # delete the graph and check if vertices and edges became orphans graph.delete(manager=self.manager, del_orphans=False) orphans = self.manager.get_orphans() self.assertEqual(len(orphans), 2 * self.count)