| 
									
										
										
										
											2025-04-03 10:39:47 +05:30
										 |  |  | #  Copyright 2025 Collate | 
					
						
							|  |  |  | #  Licensed under the Collate Community License, Version 1.0 (the "License"); | 
					
						
							| 
									
										
										
										
											2022-12-13 06:36:55 +01:00
										 |  |  | #  you may not use this file except in compliance with the License. | 
					
						
							|  |  |  | #  You may obtain a copy of the License at | 
					
						
							| 
									
										
										
										
											2025-04-03 10:39:47 +05:30
										 |  |  | #  https://github.com/open-metadata/OpenMetadata/blob/main/ingestion/LICENSE | 
					
						
							| 
									
										
										
										
											2022-12-13 06:36:55 +01:00
										 |  |  | #  Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  | #  distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  | #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  | #  See the License for the specific language governing permissions and | 
					
						
							|  |  |  | #  limitations under the License. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | OMeta User Mixin integration tests. The API needs to be up | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | import logging | 
					
						
							|  |  |  | import time | 
					
						
							|  |  |  | from unittest import TestCase | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-25 07:51:22 +02:00
										 |  |  | from _openmetadata_testutils.ometa import int_admin_ometa | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  | from metadata.generated.schema.api.teams.createTeam import CreateTeamRequest | 
					
						
							| 
									
										
										
										
											2022-12-13 06:36:55 +01:00
										 |  |  | from metadata.generated.schema.api.teams.createUser import CreateUserRequest | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  | from metadata.generated.schema.entity.teams.team import Team, TeamType | 
					
						
							| 
									
										
										
										
											2022-12-13 06:36:55 +01:00
										 |  |  | from metadata.generated.schema.entity.teams.user import User | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-13 06:36:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | class OMetaUserTest(TestCase): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Run this integration test with the local API available | 
					
						
							|  |  |  |     Install the ingestion package before running the tests | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  |     metadata = int_admin_ometa() | 
					
						
							| 
									
										
										
										
											2022-12-13 06:36:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def check_es_index(cls) -> None: | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         Wait until the index has been updated with the test user. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         logging.info("Checking ES index status...") | 
					
						
							|  |  |  |         tries = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         res = None | 
					
						
							|  |  |  |         while not res and tries <= 5:  # Kill in 5 seconds | 
					
						
							|  |  |  |             res = cls.metadata.es_search_from_fqn( | 
					
						
							|  |  |  |                 entity_type=User, | 
					
						
							|  |  |  |                 fqn_search_string="Levy", | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             if not res: | 
					
						
							|  |  |  |                 tries += 1 | 
					
						
							|  |  |  |                 time.sleep(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def setUpClass(cls) -> None: | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         Prepare ingredients | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  |         cls.team: Team = cls.metadata.create_or_update( | 
					
						
							|  |  |  |             data=CreateTeamRequest( | 
					
						
							|  |  |  |                 teamType=TeamType.Group, name="ops.team", email="ops.team@getcollate.io" | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-13 06:36:55 +01:00
										 |  |  |         cls.user_1: User = cls.metadata.create_or_update( | 
					
						
							|  |  |  |             data=CreateUserRequest( | 
					
						
							| 
									
										
										
										
											2024-12-18 16:44:54 +05:30
										 |  |  |                 name="random.user.es", | 
					
						
							|  |  |  |                 email="random.user.es@getcollate.io", | 
					
						
							|  |  |  |                 description="test", | 
					
						
							| 
									
										
										
										
											2022-12-13 06:36:55 +01:00
										 |  |  |             ), | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cls.user_2: User = cls.metadata.create_or_update( | 
					
						
							|  |  |  |             data=CreateUserRequest(name="Levy", email="user2.1234@getcollate.io"), | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-22 04:50:47 +01:00
										 |  |  |         cls.user_3: User = cls.metadata.create_or_update( | 
					
						
							|  |  |  |             data=CreateUserRequest(name="Lima", email="random.lima@getcollate.io"), | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-13 06:36:55 +01:00
										 |  |  |         # Leave some time for indexes to get updated, otherwise this happens too fast | 
					
						
							|  |  |  |         cls.check_es_index() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def tearDownClass(cls) -> None: | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         Clean up | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cls.metadata.delete( | 
					
						
							|  |  |  |             entity=User, | 
					
						
							|  |  |  |             entity_id=cls.user_1.id, | 
					
						
							|  |  |  |             hard_delete=True, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cls.metadata.delete( | 
					
						
							|  |  |  |             entity=User, | 
					
						
							|  |  |  |             entity_id=cls.user_2.id, | 
					
						
							|  |  |  |             hard_delete=True, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  |         cls.metadata.delete( | 
					
						
							|  |  |  |             entity=User, | 
					
						
							|  |  |  |             entity_id=cls.user_3.id, | 
					
						
							|  |  |  |             hard_delete=True, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cls.metadata.delete( | 
					
						
							|  |  |  |             entity=Team, | 
					
						
							|  |  |  |             entity_id=cls.team.id, | 
					
						
							|  |  |  |             hard_delete=True, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-13 06:36:55 +01:00
										 |  |  |     def test_es_search_from_email(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         We can fetch users by its email | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # No email returns None | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  |         self.assertIsNone(self.metadata.get_reference_by_email(email=None)) | 
					
						
							| 
									
										
										
										
											2022-12-13 06:36:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # Non existing email returns None | 
					
						
							|  |  |  |         self.assertIsNone( | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  |             self.metadata.get_reference_by_email(email="idonotexist@random.com") | 
					
						
							| 
									
										
										
										
											2022-12-13 06:36:55 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-22 04:50:47 +01:00
										 |  |  |         # Non existing email returns, even if they have the same domain | 
					
						
							|  |  |  |         # To get this fixed, we had to update the `email` field in the | 
					
						
							|  |  |  |         # index as a `keyword` and search by `email.keyword` in ES. | 
					
						
							|  |  |  |         self.assertIsNone( | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  |             self.metadata.get_reference_by_email(email="idonotexist@getcollate.io") | 
					
						
							| 
									
										
										
										
											2023-03-22 04:50:47 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-13 06:36:55 +01:00
										 |  |  |         # I can get User 1, who has the name equal to its email | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.user_1.id, | 
					
						
							| 
									
										
										
										
											2024-07-29 23:06:39 -07:00
										 |  |  |             self.metadata.get_reference_by_email(email="random.user.es@getcollate.io") | 
					
						
							|  |  |  |             .root[0] | 
					
						
							|  |  |  |             .id, | 
					
						
							| 
									
										
										
										
											2022-12-13 06:36:55 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # I can get User 2, who has an email not matching the name | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.user_2.id, | 
					
						
							| 
									
										
										
										
											2024-07-29 23:06:39 -07:00
										 |  |  |             self.metadata.get_reference_by_email(email="user2.1234@getcollate.io") | 
					
						
							|  |  |  |             .root[0] | 
					
						
							|  |  |  |             .id, | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # I can get the team by its mail | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.team.id, | 
					
						
							| 
									
										
										
										
											2024-07-29 23:06:39 -07:00
										 |  |  |             self.metadata.get_reference_by_email(email="ops.team@getcollate.io") | 
					
						
							|  |  |  |             .root[0] | 
					
						
							|  |  |  |             .id, | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_es_search_from_name(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         We can fetch users by its name | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         # No email returns None | 
					
						
							|  |  |  |         self.assertIsNone(self.metadata.get_reference_by_name(name=None)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Non existing email returns None | 
					
						
							|  |  |  |         self.assertIsNone(self.metadata.get_reference_by_name(name="idonotexist")) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-14 21:25:21 +05:30
										 |  |  |         # when searching for "data" user we should not get DataInsightsApplicationBot in result | 
					
						
							|  |  |  |         team_data = self.metadata.get_reference_by_name(name="data").root[0] | 
					
						
							|  |  |  |         self.assertEqual(team_data.name, "Data") | 
					
						
							|  |  |  |         self.assertEqual(team_data.type, "team") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  |         # We can get the user matching its name | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.user_1.id, | 
					
						
							| 
									
										
										
										
											2024-07-29 23:06:39 -07:00
										 |  |  |             self.metadata.get_reference_by_name(name="random.user.es").root[0].id, | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Casing does not matter | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.user_2.id, | 
					
						
							| 
									
										
										
										
											2024-07-29 23:06:39 -07:00
										 |  |  |             self.metadata.get_reference_by_name(name="levy").root[0].id, | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.user_2.id, | 
					
						
							| 
									
										
										
										
											2024-07-29 23:06:39 -07:00
										 |  |  |             self.metadata.get_reference_by_name(name="Levy").root[0].id, | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.user_1.id, | 
					
						
							| 
									
										
										
										
											2024-07-29 23:06:39 -07:00
										 |  |  |             self.metadata.get_reference_by_name(name="Random User Es").root[0].id, | 
					
						
							| 
									
										
										
										
											2023-12-28 19:25:00 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # I can get the team by its name | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             self.team.id, | 
					
						
							| 
									
										
										
										
											2024-07-29 23:06:39 -07:00
										 |  |  |             self.metadata.get_reference_by_name(name="OPS Team").root[0].id, | 
					
						
							| 
									
										
										
										
											2022-12-13 06:36:55 +01:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-07-11 14:17:13 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |         # if team is not group, return none | 
					
						
							|  |  |  |         self.assertIsNone( | 
					
						
							|  |  |  |             self.metadata.get_reference_by_name(name="Organization", is_owner=True) | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-12-18 16:44:54 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |         # description should not affect in search | 
					
						
							|  |  |  |         self.assertIsNone( | 
					
						
							|  |  |  |             self.metadata.get_reference_by_name(name="test", is_owner=True) | 
					
						
							|  |  |  |         ) |