def test_empty_result(self, mock_client):
     extractor = SpannerMetadataExtractor()
     extractor.init(
         Scoped.get_scoped_conf(conf=self.conf,
                                scope=extractor.get_scope()))
     result = extractor.extract()
     self.assertIsNone(result)
    def test_multiple_results(self, mock_client):
        col1_name = "col1"
        col2_name = "col2"
        col1_type = "int"
        col2_type = "char"
        col1_sort_order = "1"
        col2_sort_order = "2"
        mock_client.return_value.instance.return_value.database.return_value.snapshot.return_value.__enter__.return_value.execute_sql.return_value = [
            [col1_name, col1_type, col1_sort_order, self.schema, self.table],
            [col2_name, col2_type, col2_sort_order, self.schema, self.table],
        ]

        extractor = SpannerMetadataExtractor()
        extractor.init(
            Scoped.get_scoped_conf(conf=self.conf,
                                   scope=extractor.get_scope()))
        result = extractor.extract()
        assert result.database == self.connection_name
        assert result.cluster == self.project_id
        assert result.schema == f"{self.instance_id}.{self.database_id}"
        assert result.name == self.table
        self.assertEqual(
            result.columns[0].__repr__(),
            ColumnMetadata(col1_name, None, col1_type, col1_sort_order,
                           None).__repr__(),
        )
        self.assertEqual(
            result.columns[1].__repr__(),
            ColumnMetadata(col2_name, None, col2_type, col2_sort_order,
                           None).__repr__(),
        )
 def test_can_handle_instances(self, mock_build):
     mock_build.return_value = MockSpannerClient(NO_INSTANCES, None, None)
     extractor = SpannerMetadataExtractor()
     extractor.init(
         Scoped.get_scoped_conf(conf=self.conf, scope=extractor.get_scope())
     )
     result = extractor.extract()
     self.assertIsNone(result)
 def test_empty_instance(self, mock_build):
     mock_build.return_value = MockSpannerClient(ONE_INSTANCE, NO_DATABASES, None)
     extractor = SpannerMetadataExtractor()
     extractor.init(
         Scoped.get_scoped_conf(conf=self.conf, scope=extractor.get_scope())
     )
     result = extractor.extract()
     self.assertIsNone(result)
 def test_one_table_with_index(self, mock_build):
     mock_build.return_value = MockSpannerClient(
         ONE_INSTANCE, ONE_DATABASE, DATABASE_INDEX
     )
     extractor = SpannerMetadataExtractor()
     extractor.init(
         Scoped.get_scoped_conf(conf=self.conf, scope=extractor.get_scope())
     )
     result = extractor.extract()
     self.assertIsNone(result)
    def setUp(self):
        Extractor = SpannerMetadataExtractor
        scope = SpannerMetadataExtractor().get_scope()
        self.connection_name = "MOCK_CONNECTION_NAME"
        self.project_id = "MOCK_PROJECT"
        self.instance_id = "MOCK_INSTANCE"
        self.database_id = "MOCK_DATABASE"
        self.schema = "MOCK_SCHEMA"
        self.table = "MOCK_TABLE"
        config_dict = {
            f"{scope}.{Extractor.CONNECTION_NAME_KEY}": self.connection_name,
            f"{scope}.{Extractor.PROJECT_ID_KEY}": self.project_id,
            f"{scope}.{Extractor.INSTANCE_ID_KEY}": self.instance_id,
            f"{scope}.{Extractor.DATABASE_ID_KEY}": self.database_id,
        }

        self.conf = ConfigFactory.from_dict(config_dict)
    def test_two_tables(self, mock_build):
        mock_build.return_value = MockSpannerClient(
            ONE_INSTANCE, ONE_DATABASE, DATABASE_DATA_TWO_TABLES
        )
        extractor = SpannerMetadataExtractor()
        extractor.init(
            Scoped.get_scoped_conf(conf=self.conf, scope=extractor.get_scope())
        )
        result_1 = extractor.extract()
        result_2 = extractor.extract()
        self.assertEqual(result_2.database, "spanner")
        self.assertEqual(result_2.cluster, "your-project-here")
        self.assertEqual(result_2.schema, "your-instance.your-database")
        self.assertEqual(result_2.name, "MySecondTable")
        self.assertEqual(result_2.description, None)

        first_col = result_2.columns[0]
        self.assertEqual(first_col.name, "col1")
        self.assertEqual(first_col.type, "FLOAT")
        self.assertEqual(first_col.description, "")