| 
									
										
										
										
											2024-07-26 12:04:28 +02:00
										 |  |  | // GoToSocial | 
					
						
							|  |  |  | // Copyright (C) GoToSocial Authors admin@gotosocial.org | 
					
						
							|  |  |  | // SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | // GNU Affero General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  | // along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package ap_test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"bytes" | 
					
						
							|  |  |  | 	"io" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-26 15:34:10 +02:00
										 |  |  | 	"code.superseriousbusiness.org/gotosocial/internal/ap" | 
					
						
							|  |  |  | 	"code.superseriousbusiness.org/gotosocial/internal/gtsmodel" | 
					
						
							| 
									
										
										
										
											2024-07-26 12:04:28 +02:00
										 |  |  | 	"github.com/stretchr/testify/suite" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type ExtractPolicyTestSuite struct { | 
					
						
							|  |  |  | 	APTestSuite | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *ExtractPolicyTestSuite) TestExtractPolicy() { | 
					
						
							|  |  |  | 	rawNote := `{ | 
					
						
							|  |  |  |   "@context": [ | 
					
						
							|  |  |  |     "https://gotosocial.org/ns", | 
					
						
							|  |  |  |     "https://www.w3.org/ns/activitystreams" | 
					
						
							|  |  |  |   ], | 
					
						
							|  |  |  |   "content": "hey @f0x and @dumpsterqueer", | 
					
						
							|  |  |  |   "contentMap": { | 
					
						
							|  |  |  |     "en": "hey @f0x and @dumpsterqueer", | 
					
						
							|  |  |  |     "fr": "bonjour @f0x et @dumpsterqueer" | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2025-05-13 14:48:11 +00:00
										 |  |  |   "interactionPolicy": { | 
					
						
							|  |  |  |     "canLike": { | 
					
						
							|  |  |  |       "automaticApproval": [ | 
					
						
							|  |  |  |         "https://www.w3.org/ns/activitystreams#Public" | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       "manualApproval": [] | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     "canReply": { | 
					
						
							|  |  |  |       "automaticApproval": [ | 
					
						
							|  |  |  |         "http://localhost:8080/users/the_mighty_zork", | 
					
						
							|  |  |  |         "http://localhost:8080/users/the_mighty_zork/followers", | 
					
						
							|  |  |  |         "https://gts.superseriousbusiness.org/users/dumpsterqueer", | 
					
						
							|  |  |  |         "https://gts.superseriousbusiness.org/users/f0x" | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       "manualApproval": [ | 
					
						
							|  |  |  |         "https://www.w3.org/ns/activitystreams#Public" | 
					
						
							|  |  |  |       ] | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     "canAnnounce": { | 
					
						
							|  |  |  |       "automaticApproval": [ | 
					
						
							|  |  |  |         "http://localhost:8080/users/the_mighty_zork" | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       "manualApproval": [ | 
					
						
							|  |  |  |         "https://www.w3.org/ns/activitystreams#Public" | 
					
						
							|  |  |  |       ] | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   "tag": [ | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       "href": "https://gts.superseriousbusiness.org/users/dumpsterqueer", | 
					
						
							|  |  |  |       "name": "@dumpsterqueer@superseriousbusiness.org", | 
					
						
							|  |  |  |       "type": "Mention" | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       "href": "https://gts.superseriousbusiness.org/users/f0x", | 
					
						
							|  |  |  |       "name": "@f0x@superseriousbusiness.org", | 
					
						
							|  |  |  |       "type": "Mention" | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   ], | 
					
						
							|  |  |  |   "type": "Note" | 
					
						
							|  |  |  | }` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	statusable, err := ap.ResolveStatusable( | 
					
						
							| 
									
										
										
										
											2025-05-22 12:26:11 +02:00
										 |  |  | 		suite.T().Context(), | 
					
						
							| 
									
										
										
										
											2025-05-13 14:48:11 +00:00
										 |  |  | 		io.NopCloser( | 
					
						
							|  |  |  | 			bytes.NewBufferString(rawNote), | 
					
						
							|  |  |  | 		), | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	policy := ap.ExtractInteractionPolicy( | 
					
						
							|  |  |  | 		statusable, | 
					
						
							|  |  |  | 		// Zork didn't actually create | 
					
						
							|  |  |  | 		// this status but nevermind. | 
					
						
							|  |  |  | 		suite.testAccounts["local_account_1"], | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	expectedPolicy := >smodel.InteractionPolicy{ | 
					
						
							|  |  |  | 		CanLike: gtsmodel.PolicyRules{ | 
					
						
							|  |  |  | 			AutomaticApproval: gtsmodel.PolicyValues{ | 
					
						
							|  |  |  | 				gtsmodel.PolicyValuePublic, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			ManualApproval: gtsmodel.PolicyValues{}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		CanReply: gtsmodel.PolicyRules{ | 
					
						
							|  |  |  | 			AutomaticApproval: gtsmodel.PolicyValues{ | 
					
						
							|  |  |  | 				gtsmodel.PolicyValueAuthor, | 
					
						
							|  |  |  | 				gtsmodel.PolicyValueFollowers, | 
					
						
							|  |  |  | 				"https://gts.superseriousbusiness.org/users/dumpsterqueer", | 
					
						
							|  |  |  | 				"https://gts.superseriousbusiness.org/users/f0x", | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			ManualApproval: gtsmodel.PolicyValues{ | 
					
						
							|  |  |  | 				gtsmodel.PolicyValuePublic, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		CanAnnounce: gtsmodel.PolicyRules{ | 
					
						
							|  |  |  | 			AutomaticApproval: gtsmodel.PolicyValues{ | 
					
						
							|  |  |  | 				gtsmodel.PolicyValueAuthor, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			ManualApproval: gtsmodel.PolicyValues{ | 
					
						
							|  |  |  | 				gtsmodel.PolicyValuePublic, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	suite.EqualValues(expectedPolicy, policy) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (suite *ExtractPolicyTestSuite) TestExtractPolicyDeprecated() { | 
					
						
							|  |  |  | 	rawNote := `{ | 
					
						
							|  |  |  |   "@context": [ | 
					
						
							|  |  |  |     "https://gotosocial.org/ns", | 
					
						
							|  |  |  |     "https://www.w3.org/ns/activitystreams" | 
					
						
							|  |  |  |   ], | 
					
						
							|  |  |  |   "content": "hey @f0x and @dumpsterqueer", | 
					
						
							|  |  |  |   "contentMap": { | 
					
						
							|  |  |  |     "en": "hey @f0x and @dumpsterqueer", | 
					
						
							|  |  |  |     "fr": "bonjour @f0x et @dumpsterqueer" | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2024-07-26 12:04:28 +02:00
										 |  |  |   "interactionPolicy": { | 
					
						
							|  |  |  |     "canLike": { | 
					
						
							|  |  |  |       "always": [ | 
					
						
							|  |  |  |         "https://www.w3.org/ns/activitystreams#Public" | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       "approvalRequired": [] | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     "canReply": { | 
					
						
							|  |  |  |       "always": [ | 
					
						
							|  |  |  |         "http://localhost:8080/users/the_mighty_zork", | 
					
						
							|  |  |  |         "http://localhost:8080/users/the_mighty_zork/followers", | 
					
						
							|  |  |  |         "https://gts.superseriousbusiness.org/users/dumpsterqueer", | 
					
						
							|  |  |  |         "https://gts.superseriousbusiness.org/users/f0x" | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       "approvalRequired": [ | 
					
						
							|  |  |  |         "https://www.w3.org/ns/activitystreams#Public" | 
					
						
							|  |  |  |       ] | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     "canAnnounce": { | 
					
						
							|  |  |  |       "always": [ | 
					
						
							|  |  |  |         "http://localhost:8080/users/the_mighty_zork" | 
					
						
							|  |  |  |       ], | 
					
						
							|  |  |  |       "approvalRequired": [ | 
					
						
							|  |  |  |         "https://www.w3.org/ns/activitystreams#Public" | 
					
						
							|  |  |  |       ] | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   "tag": [ | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       "href": "https://gts.superseriousbusiness.org/users/dumpsterqueer", | 
					
						
							|  |  |  |       "name": "@dumpsterqueer@superseriousbusiness.org", | 
					
						
							|  |  |  |       "type": "Mention" | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       "href": "https://gts.superseriousbusiness.org/users/f0x", | 
					
						
							|  |  |  |       "name": "@f0x@superseriousbusiness.org", | 
					
						
							|  |  |  |       "type": "Mention" | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   ], | 
					
						
							|  |  |  |   "type": "Note" | 
					
						
							|  |  |  | }` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	statusable, err := ap.ResolveStatusable( | 
					
						
							| 
									
										
										
										
											2025-05-22 12:26:11 +02:00
										 |  |  | 		suite.T().Context(), | 
					
						
							| 
									
										
										
										
											2024-07-26 12:04:28 +02:00
										 |  |  | 		io.NopCloser( | 
					
						
							|  |  |  | 			bytes.NewBufferString(rawNote), | 
					
						
							|  |  |  | 		), | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		suite.FailNow(err.Error()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	policy := ap.ExtractInteractionPolicy( | 
					
						
							|  |  |  | 		statusable, | 
					
						
							|  |  |  | 		// Zork didn't actually create | 
					
						
							|  |  |  | 		// this status but nevermind. | 
					
						
							|  |  |  | 		suite.testAccounts["local_account_1"], | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	expectedPolicy := >smodel.InteractionPolicy{ | 
					
						
							|  |  |  | 		CanLike: gtsmodel.PolicyRules{ | 
					
						
							| 
									
										
										
										
											2025-05-13 14:48:11 +00:00
										 |  |  | 			AutomaticApproval: gtsmodel.PolicyValues{ | 
					
						
							| 
									
										
										
										
											2024-07-26 12:04:28 +02:00
										 |  |  | 				gtsmodel.PolicyValuePublic, | 
					
						
							|  |  |  | 			}, | 
					
						
							| 
									
										
										
										
											2025-05-13 14:48:11 +00:00
										 |  |  | 			ManualApproval: gtsmodel.PolicyValues{}, | 
					
						
							| 
									
										
										
										
											2024-07-26 12:04:28 +02:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		CanReply: gtsmodel.PolicyRules{ | 
					
						
							| 
									
										
										
										
											2025-05-13 14:48:11 +00:00
										 |  |  | 			AutomaticApproval: gtsmodel.PolicyValues{ | 
					
						
							| 
									
										
										
										
											2024-07-26 12:04:28 +02:00
										 |  |  | 				gtsmodel.PolicyValueAuthor, | 
					
						
							|  |  |  | 				gtsmodel.PolicyValueFollowers, | 
					
						
							|  |  |  | 				"https://gts.superseriousbusiness.org/users/dumpsterqueer", | 
					
						
							|  |  |  | 				"https://gts.superseriousbusiness.org/users/f0x", | 
					
						
							|  |  |  | 			}, | 
					
						
							| 
									
										
										
										
											2025-05-13 14:48:11 +00:00
										 |  |  | 			ManualApproval: gtsmodel.PolicyValues{ | 
					
						
							| 
									
										
										
										
											2024-07-26 12:04:28 +02:00
										 |  |  | 				gtsmodel.PolicyValuePublic, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		CanAnnounce: gtsmodel.PolicyRules{ | 
					
						
							| 
									
										
										
										
											2025-05-13 14:48:11 +00:00
										 |  |  | 			AutomaticApproval: gtsmodel.PolicyValues{ | 
					
						
							| 
									
										
										
										
											2024-07-26 12:04:28 +02:00
										 |  |  | 				gtsmodel.PolicyValueAuthor, | 
					
						
							|  |  |  | 			}, | 
					
						
							| 
									
										
										
										
											2025-05-13 14:48:11 +00:00
										 |  |  | 			ManualApproval: gtsmodel.PolicyValues{ | 
					
						
							| 
									
										
										
										
											2024-07-26 12:04:28 +02:00
										 |  |  | 				gtsmodel.PolicyValuePublic, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	suite.EqualValues(expectedPolicy, policy) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestExtractPolicyTestSuite(t *testing.T) { | 
					
						
							|  |  |  | 	suite.Run(t, &ExtractPolicyTestSuite{}) | 
					
						
							|  |  |  | } |