diff --git a/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/DataLayer/Utils/DataUtils.swift b/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/DataLayer/Utils/DataUtils.swift index 022b4db..94dc88b 100644 --- a/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/DataLayer/Utils/DataUtils.swift +++ b/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/DataLayer/Utils/DataUtils.swift @@ -129,32 +129,6 @@ func addPost(for commenting_user: User, post_content: String, logged_users: [Use } - func printAllUsers(context: ModelContext) { - let fetchRequest = FetchDescriptor() // Create a fetch descriptor for User - //print(fetchRequest) - do { - let users: [User] = try context.fetch(fetchRequest) // Fetch all users - print("Users in Database:") - for user in users { - print("Name: \(user.name), Email: \(user.email), Admin: \(user.admin)") - } - } catch { - print("Failed to fetch users: \(error.localizedDescription)") - } - } - - func printAllPosts(context: ModelContext) { - let fetchRequest = FetchDescriptor() // Create a fetch descriptor for Post - do { - let posts: [Post] = try context.fetch(fetchRequest) // Fetch all posts - print("Posts in Database:") - for post in posts { - print("Contents: \(post.contents), Created At: \(post.createdAt), Posted By: \(post.user.name)") - } - } catch { - print("Failed to fetch posts: \(error.localizedDescription)") - } - } func printAllComments(context: ModelContext) { let fetchRequest = FetchDescriptor() // Create a fetch descriptor for Comment diff --git a/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/ViewLayer/ContentView.swift b/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/ViewLayer/ContentView.swift index d6aaf9f..82c451a 100644 --- a/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/ViewLayer/ContentView.swift +++ b/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/ViewLayer/ContentView.swift @@ -82,7 +82,7 @@ struct ContentView: View { } - NavigationLink(destination: commentView(comments: post.comments, isAdmin: isAdmin, isLoggedIn: isLoggedIn)) { + NavigationLink(destination: commentView(comments: post.comments, isAdmin: isAdmin, isLoggedIn: isLoggedIn, selectedPost: post, currentUser: post.user)) { Text("View all comments") .font(.caption) .foregroundColor(.blue) diff --git a/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/ViewLayer/commentView.swift b/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/ViewLayer/commentView.swift index 86c6399..1b650bd 100644 --- a/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/ViewLayer/commentView.swift +++ b/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/ViewLayer/commentView.swift @@ -14,20 +14,22 @@ struct commentView: View{ @State var comments: [Comment] let isAdmin: Bool let isLoggedIn: Bool + let selectedPost: Post + let currentUser: User + + + @Environment(\.modelContext) var context var body : some View{ VStack{ List(comments, id: \.createdAt) { comment in - - - VStack(alignment: .leading) { HStack{ VStack{ Text(comment.contents) .font(.body) } - if isAdmin { + if isAdmin && isLoggedIn { Button(action: { commentToDelete = comment showDeleteConfirmation = true @@ -47,8 +49,8 @@ struct commentView: View{ } .navigationTitle("Comments") - if isLoggedIn || isAdmin { - NavigationLink(destination: newCommentView()) { + if isLoggedIn && isAdmin { + NavigationLink(destination: newCommentView(selectedPost: selectedPost, currentUser: currentUser, comments: $comments)) { Text("Add a comment") .font(.caption) .foregroundColor(.blue) @@ -69,7 +71,12 @@ struct commentView: View{ } } func deleteComment(_ comment: Comment) { - comments.removeAll { $0.createdAt == comment.createdAt } - print("Comment deleted: \(comment.contents)") + do{ + try DataUtils.deleteComment(for: context, comment: comment) + comments.removeAll { $0.createdAt == comment.createdAt } + print("Comment deleted: \(comment.contents)") + } catch{ + print("Failed to delete comment: \(error)") + } } } diff --git a/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/ViewLayer/newCommentView.swift b/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/ViewLayer/newCommentView.swift index a3f87db..50d6de0 100644 --- a/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/ViewLayer/newCommentView.swift +++ b/mini-project-SeniorDesign/miniProject-seniorDesign/Preview Content/ViewLayer/newCommentView.swift @@ -7,19 +7,48 @@ import SwiftUI struct newCommentView: View{ - @State var newCommentString = "" + @State private var newCommentString = "" + @Environment(\.modelContext) var context + + let selectedPost: Post + let currentUser: User + @Binding var comments: [Comment] + var body: some View{ VStack{ Text("Add a comment").font(.title2) TextField("Enter a comment", text: $newCommentString) .textFieldStyle(RoundedBorderTextFieldStyle()) .padding(.horizontal, 20) + Button(action: { + addComment() + }){ + Text("Post") + .padding() + .background(Color.blue) + .foregroundColor(.white) + .cornerRadius(8) + } + .padding(.top, 10) + + } + } + func addComment(){ + do{ + let comment = try DataUtils.addComment(for: context, post: selectedPost, user: currentUser, contents: newCommentString) + newCommentString = "" + comments.append(comment) + + + }catch{ + print("Failed to add post: \(error)") } } } + #Preview { ContentView() } diff --git a/mini-project-SeniorDesign/miniProject-seniorDesignTests/DataUtilsTesting.swift b/mini-project-SeniorDesign/miniProject-seniorDesignTests/DataUtilsTesting.swift index bd75ad9..5afa10e 100644 --- a/mini-project-SeniorDesign/miniProject-seniorDesignTests/DataUtilsTesting.swift +++ b/mini-project-SeniorDesign/miniProject-seniorDesignTests/DataUtilsTesting.swift @@ -89,5 +89,74 @@ class DataUtilsTesting { let result = try! DataUtils.userLogin(for: notLoggedUser, context: modelContext) #expect(result == true) } + + @Test("delete a comment") func deleteComment() { + let context = self.modelContext + var commentsInContext: [miniProject_seniorDesign.Comment] = [] + + let user = User(name: "Test User", email: "testuser@example.com", admin: true) + context.insert(user) + + let post = Post(user: user, contents: "Test post content") + context.insert(post) + + + let comment = Comment(user: user, post: post, contents: "Test comment", createdAt: Date()) + context.insert(comment) + commentsInContext.append(comment) + + #expect(commentsInContext.contains { $0 === comment } == true) + + do { + try DataUtils.deleteComment(for: context, comment: comment) + commentsInContext.removeAll { $0 === comment } + let isCommentDeleted = !commentsInContext.contains { $0 === comment } + #expect(isCommentDeleted == true) + } catch { + #expect(Bool(false), "Error deleting comment: \(error)") + } + } + @Test("add a empty comment")func addEmptyComment(){ + let context = self.modelContext + var commentsInContext: [miniProject_seniorDesign.Comment] = [] + + let user = User(name: "Test User", email: "testuser@example.com", admin: true) + context.insert(user) + + let post = Post(user: user, contents: "Test post content") + context.insert(post) + + let contents = "" + + do{ + let comment = try DataUtils.addComment(for: context, post: post, user: user, contents: contents) + commentsInContext.append(comment) + #expect(Bool(false), "Expected an error when adding an empty comment, but it succeeded.") + + }catch{ + #expect(commentsInContext.isEmpty == true, "No comment should be added for empty content") + } + } + @Test("add a comment")func addComment(){ + let context = self.modelContext + var commentsInContext: [miniProject_seniorDesign.Comment] = [] + + let user = User(name: "Test User", email: "testuser@example.com", admin: true) + context.insert(user) + + let post = Post(user: user, contents: "Test post content") + context.insert(post) + + let contents = "This is a test comment" + do{ + let comment = try DataUtils.addComment(for: context, post: post, user: user, contents: contents) + commentsInContext.append(comment) + #expect(!commentsInContext.isEmpty == true) + + }catch{ + #expect(Bool(false), "Error adding a valid comment: \(error)") + } + } + }