Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LF-105 Add User.getInfo() using a session key #107

Merged
merged 1 commit into from Jan 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions Sources/LastFM/Modules/UserModule.swift
Expand Up @@ -129,6 +129,12 @@ public struct UserModule {

requester.getDataAndParse(params: params, secure: false, onCompletion: onCompletion)
}

public func getInfo(sessionKey: String, onCompletion: @escaping LastFM.OnCompletion<UserInfo>) throws {
let params = parent.normalizeParams(params: [:], method: APIMethod.getInfo, sessionKey: sessionKey)

try requester.postFormURLEncodedAndParse(payload: params, secure: false, onCompletion: onCompletion)
}

public func getFriends(
params: SearchParams,
Expand Down
95 changes: 95 additions & 0 deletions Tests/LastFMTests/Modules/UserModuleTests.swift
Expand Up @@ -1150,6 +1150,101 @@ class UserTests: XCTestCase {
)
)
}

func test_getInfoBySessionKey() throws {
let jsonURL = Bundle.module.url(
forResource: "Resources/user.getInfo",
withExtension: "json"
)!

let fakeData = try Data(contentsOf: jsonURL)
let expectation = expectation(description: "Waiting for getInfo")

apiClientMock.data = fakeData
apiClientMock.response = Constants.RESPONSE_200_OK

try instance.getInfo(sessionKey: "someSessionKey") { result in
switch (result) {
case .success(let userInfo):
XCTAssertEqual(userInfo.name, "pepito")
XCTAssertEqual(userInfo.age, 0)
XCTAssertEqual(userInfo.subscriber, false)
XCTAssertEqual(userInfo.realname, "Jose")
XCTAssertEqual(userInfo.bootstrap, false)
XCTAssertEqual(userInfo.playcount, 347575)
XCTAssertEqual(userInfo.artistCount, 14264)
XCTAssertEqual(userInfo.playlists, 0)
XCTAssertEqual(userInfo.trackCount, 55279)
XCTAssertEqual(userInfo.albumCount, 30492)

XCTAssertEqual(
userInfo.image.small?.absoluteString,
"https://images.com/pepito-small.png"
)

XCTAssertEqual(
userInfo.image.medium?.absoluteString,
"https://images.com/pepito-medium.png"
)

XCTAssertEqual(
userInfo.image.large?.absoluteString,
"https://images.com/pepito-large.png"
)

XCTAssertEqual(
userInfo.image.extraLarge?.absoluteString,
"https://images.com/pepito-extralarge.png"
)

XCTAssertNil(userInfo.image.mega)

var dateComponents = DateComponents()
dateComponents.year = 2011
dateComponents.month = 8
dateComponents.day = 17
dateComponents.hour = 18
dateComponents.minute = 28
dateComponents.second = 10
dateComponents.timeZone = TimeZone(secondsFromGMT: -4 * 60 * 60)

XCTAssertEqual(userInfo.registered, Calendar.current.date(from: dateComponents))
XCTAssertEqual(userInfo.country, "Bolivia")
XCTAssertEqual(userInfo.gender, "n")
XCTAssertEqual(userInfo.url.absoluteString, "https://pepito.profile")
XCTAssertEqual(userInfo.type, "user")
case .failure(let error):
XCTFail("It was supposed to succeed, but it failed with error \(error.localizedDescription)")
}

expectation.fulfill()
}

waitForExpectations(timeout: 3)
XCTAssertEqual(apiClientMock.postCalls.count, 1)

let actualBody = String(data: apiClientMock.postCalls[0].body!, encoding: .utf8)!
let expectedBody = "sk=someSessionKey&method=user.getinfo&api_key=someAPIKey"

XCTAssertTrue(
Util.areSameURL(
"http://somedomain.com/?\(actualBody)",
"http://somedomain.com/?\(expectedBody)"
)
)

XCTAssertEqual(
apiClientMock.postCalls[0].headers,
["Content-Type": "application/x-www-formurlencoded"]
)

XCTAssertTrue(
Util.areSameURL(
"http://ws.audioscrobbler.com/2.0?format=json",
apiClientMock.postCalls[0].url.absoluteString
)
)
}

func test_getFriends_success() throws {
let jsonURL = Bundle.module.url(
Expand Down