// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.

import Foundation

import Quick
import Nimble

@testable import SessionMessagingKit

class OpenGroupSpec: QuickSpec {
    // MARK: - Spec

    override func spec() {
        describe("an Open Group") {
            context("when initializing") {
                it("generates the id") {
                    let openGroup: OpenGroup = OpenGroup(
                        server: "server",
                        room: "room",
                        publicKey: "1234",
                        name: "name",
                        groupDescription: nil,
                        imageID: nil,
                        infoUpdates: 0
                    )
                    
                    expect(openGroup.id).to(equal("server.room"))
                }
            }
            
            context("when NSCoding") {
                // Note: Unit testing NSCoder is horrible so we won't do it - wait until we refactor it to Codable
                it("successfully encodes and decodes") {
                    let openGroupToEncode: OpenGroup = OpenGroup(
                        server: "server",
                        room: "room",
                        publicKey: "1234",
                        name: "name",
                        groupDescription: "desc",
                        imageID: "image",
                        infoUpdates: 1
                    )
                    let encodedData: Data = try! NSKeyedArchiver.archivedData(withRootObject: openGroupToEncode, requiringSecureCoding: false)
                    let openGroup: OpenGroup? = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(encodedData) as? OpenGroup
                    
                    expect(openGroup).toNot(beNil())
                    expect(openGroup?.id).to(equal("server.room"))
                    expect(openGroup?.server).to(equal("server"))
                    expect(openGroup?.room).to(equal("room"))
                    expect(openGroup?.publicKey).to(equal("1234"))
                    expect(openGroup?.name).to(equal("name"))
                    expect(openGroup?.groupDescription).to(equal("desc"))
                    expect(openGroup?.imageID).to(equal("image"))
                    expect(openGroup?.infoUpdates).to(equal(1))
                }
            }
            
            context("when describing") {
                it("includes relevant information") {
                    let openGroup: OpenGroup = OpenGroup(
                        server: "server",
                        room: "room",
                        publicKey: "1234",
                        name: "name",
                        groupDescription: nil,
                        imageID: nil,
                        infoUpdates: 0
                    )
                    
                    expect(openGroup.description)
                        .to(equal("name (Server: server, Room: room)"))
                }
            }
        }
    }
}