deezer-python-gql 0.2.0__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deezer-python-gql
3
- Version: 0.2.0
3
+ Version: 0.4.0
4
4
  Summary: Async typed Python client for Deezer's Pipe GraphQL API.
5
5
  Author-email: Julian Daberkow <jdaberkow@users.noreply.github.com>
6
6
  License: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deezer-python-gql
3
- Version: 0.2.0
3
+ Version: 0.4.0
4
4
  Summary: Async typed Python client for Deezer's Pipe GraphQL API.
5
5
  Author-email: Julian Daberkow <jdaberkow@users.noreply.github.com>
6
6
  License: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "deezer-python-gql"
3
- version = "0.2.0"
3
+ version = "0.4.0"
4
4
  description = "Async typed Python client for Deezer's Pipe GraphQL API."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -26,6 +26,13 @@ from deezer_python_gql.base_client import (
26
26
  GraphQLClientHttpError,
27
27
  GraphQLClientInvalidResponseError,
28
28
  )
29
+ from deezer_python_gql.generated.add_album_to_favorite import AddAlbumToFavorite
30
+ from deezer_python_gql.generated.add_artist_to_favorite import AddArtistToFavorite
31
+ from deezer_python_gql.generated.add_playlist_to_favorite import AddPlaylistToFavorite
32
+ from deezer_python_gql.generated.add_track_to_favorite import AddTrackToFavorite
33
+ from deezer_python_gql.generated.add_tracks_to_playlist import AddTracksToPlaylist
34
+ from deezer_python_gql.generated.create_playlist import CreatePlaylist
35
+ from deezer_python_gql.generated.delete_playlist import DeletePlaylist
29
36
  from deezer_python_gql.generated.get_album import GetAlbum
30
37
  from deezer_python_gql.generated.get_artist import GetArtist
31
38
  from deezer_python_gql.generated.get_charts import GetCharts
@@ -44,8 +51,17 @@ from deezer_python_gql.generated.get_recommendations import GetRecommendations
44
51
  from deezer_python_gql.generated.get_smart_tracklist import GetSmartTracklist
45
52
  from deezer_python_gql.generated.get_track import GetTrack
46
53
  from deezer_python_gql.generated.get_user_charts import GetUserCharts
54
+ from deezer_python_gql.generated.get_user_playlists import GetUserPlaylists
55
+ from deezer_python_gql.generated.remove_album_from_favorite import RemoveAlbumFromFavorite
56
+ from deezer_python_gql.generated.remove_artist_from_favorite import RemoveArtistFromFavorite
57
+ from deezer_python_gql.generated.remove_playlist_from_favorite import (
58
+ RemovePlaylistFromFavorite,
59
+ )
60
+ from deezer_python_gql.generated.remove_track_from_favorite import RemoveTrackFromFavorite
61
+ from deezer_python_gql.generated.remove_tracks_from_playlist import RemoveTracksFromPlaylist
47
62
  from deezer_python_gql.generated.search import Search
48
63
  from deezer_python_gql.generated.search_flows import SearchFlows
64
+ from deezer_python_gql.generated.update_playlist import UpdatePlaylist
49
65
 
50
66
  FIXTURES = Path(__file__).parent / "fixtures"
51
67
 
@@ -131,6 +147,20 @@ def test_client_has_generated_methods() -> None:
131
147
  "get_favorite_playlists",
132
148
  "search_flows",
133
149
  "get_user_charts",
150
+ "get_user_playlists",
151
+ "add_artist_to_favorite",
152
+ "remove_artist_from_favorite",
153
+ "add_album_to_favorite",
154
+ "remove_album_from_favorite",
155
+ "add_track_to_favorite",
156
+ "remove_track_from_favorite",
157
+ "add_playlist_to_favorite",
158
+ "remove_playlist_from_favorite",
159
+ "create_playlist",
160
+ "update_playlist",
161
+ "delete_playlist",
162
+ "add_tracks_to_playlist",
163
+ "remove_tracks_from_playlist",
134
164
  ]
135
165
  for method in expected_methods:
136
166
  assert hasattr(client, method), f"Missing method: {method}"
@@ -588,6 +618,7 @@ def test_smoke_get_favorite_artists() -> None:
588
618
  artist_node = artists.edges[0].node
589
619
  assert artist_node is not None
590
620
  assert artist_node.name == "Daft Punk"
621
+ assert artists.edges[0].favorited_at == "2025-06-15"
591
622
  assert artists.page_info.has_next_page is True
592
623
 
593
624
 
@@ -602,6 +633,7 @@ def test_smoke_get_favorite_albums() -> None:
602
633
  album_node = albums.edges[0].node
603
634
  assert album_node is not None
604
635
  assert album_node.display_title == "Discovery"
636
+ assert albums.edges[0].favorited_at == "2025-06-15"
605
637
  assert albums.page_info.has_next_page is True
606
638
 
607
639
 
@@ -616,6 +648,7 @@ def test_smoke_get_favorite_tracks() -> None:
616
648
  track_node = tracks.edges[0].node
617
649
  assert track_node is not None
618
650
  assert track_node.title == "Harder, Better, Faster, Stronger"
651
+ assert tracks.edges[0].favorited_at == "2025-06-15"
619
652
  assert tracks.page_info.has_next_page is True
620
653
 
621
654
 
@@ -630,6 +663,7 @@ def test_smoke_get_favorite_playlists() -> None:
630
663
  playlist_node = playlists.edges[0].node
631
664
  assert playlist_node is not None
632
665
  assert playlist_node.title == "Electronic Hits"
666
+ assert playlists.edges[0].favorited_at == "2025-06-15"
633
667
  assert playlists.page_info.has_next_page is True
634
668
 
635
669
 
@@ -650,20 +684,154 @@ def test_smoke_search_flows() -> None:
650
684
 
651
685
 
652
686
  def test_smoke_get_user_charts() -> None:
653
- """Verify GetUserCharts fixture parses personal top tracks/artists/albums."""
687
+ """Verify GetUserCharts fixture parses personal top tracks, artists, and albums."""
654
688
  data = _load_fixture("get_user_charts.json")
655
689
  me = GetUserCharts.model_validate(data).me
656
690
  assert me is not None
657
691
  charts = me.charts
692
+ assert charts is not None
658
693
  assert charts.tracks is not None
659
- assert len(charts.tracks.edges) == 2
660
- assert charts.tracks.edges[0].node is not None
661
- assert charts.tracks.edges[0].node.title == "Harder, Better, Faster, Stronger"
694
+ assert len(charts.tracks.edges) > 0
662
695
  assert charts.artists is not None
663
- assert len(charts.artists.edges) == 2
664
- assert charts.artists.edges[0].node is not None
665
- assert charts.artists.edges[0].node.name == "Daft Punk"
696
+ assert len(charts.artists.edges) > 0
666
697
  assert charts.albums is not None
667
- assert len(charts.albums.edges) == 1
668
- assert charts.albums.edges[0].node is not None
669
- assert charts.albums.edges[0].node.display_title == "Discovery"
698
+ assert len(charts.albums.edges) > 0
699
+
700
+
701
+ # ---------------------------------------------------------------------------
702
+ # 6. User playlists query smoke test
703
+ # ---------------------------------------------------------------------------
704
+
705
+
706
+ def test_smoke_get_user_playlists() -> None:
707
+ """Verify GetUserPlaylists fixture parses with paginated playlist nodes."""
708
+ data = _load_fixture("get_user_playlists.json")
709
+ me = GetUserPlaylists.model_validate(data).me
710
+ assert me is not None
711
+ playlists = me.playlists
712
+ assert len(playlists.edges) == 1
713
+ node = playlists.edges[0].node
714
+ assert node is not None
715
+ assert node.id == "1000000001"
716
+ assert node.title == "My Playlist"
717
+ assert node.estimated_tracks_count == 42
718
+ assert node.owner is not None
719
+ assert node.owner.name == "TestUser"
720
+ assert playlists.page_info.has_next_page is False
721
+
722
+
723
+ # ---------------------------------------------------------------------------
724
+ # 7. Favorite mutation smoke tests
725
+ # ---------------------------------------------------------------------------
726
+
727
+
728
+ def test_smoke_add_artist_to_favorite() -> None:
729
+ """Verify AddArtistToFavorite fixture parses with returned artist."""
730
+ data = _load_fixture("add_artist_to_favorite.json")
731
+ result = AddArtistToFavorite.model_validate(data)
732
+ assert result.add_artist_to_favorite.artist.id == "100000001"
733
+ assert result.add_artist_to_favorite.artist.name == "Test Artist"
734
+
735
+
736
+ def test_smoke_remove_artist_from_favorite() -> None:
737
+ """Verify RemoveArtistFromFavorite fixture parses with returned artist."""
738
+ data = _load_fixture("remove_artist_from_favorite.json")
739
+ result = RemoveArtistFromFavorite.model_validate(data)
740
+ assert result.remove_artist_from_favorite.artist.id == "100000001"
741
+ assert result.remove_artist_from_favorite.artist.name == "Test Artist"
742
+
743
+
744
+ def test_smoke_add_album_to_favorite() -> None:
745
+ """Verify AddAlbumToFavorite fixture parses with returned album."""
746
+ data = _load_fixture("add_album_to_favorite.json")
747
+ result = AddAlbumToFavorite.model_validate(data)
748
+ assert result.add_album_to_favorite.album.id == "100000001"
749
+ assert result.add_album_to_favorite.album.display_title == "Test Album"
750
+
751
+
752
+ def test_smoke_remove_album_from_favorite() -> None:
753
+ """Verify RemoveAlbumFromFavorite fixture parses with returned album."""
754
+ data = _load_fixture("remove_album_from_favorite.json")
755
+ result = RemoveAlbumFromFavorite.model_validate(data)
756
+ assert result.remove_album_from_favorite.album.id == "100000001"
757
+ assert result.remove_album_from_favorite.album.display_title == "Test Album"
758
+
759
+
760
+ def test_smoke_add_track_to_favorite() -> None:
761
+ """Verify AddTrackToFavorite fixture parses with returned track."""
762
+ data = _load_fixture("add_track_to_favorite.json")
763
+ result = AddTrackToFavorite.model_validate(data)
764
+ assert result.add_track_to_favorite.track.id == "100000001"
765
+ assert result.add_track_to_favorite.track.title == "Test Track"
766
+
767
+
768
+ def test_smoke_remove_track_from_favorite() -> None:
769
+ """Verify RemoveTrackFromFavorite fixture parses with returned track."""
770
+ data = _load_fixture("remove_track_from_favorite.json")
771
+ result = RemoveTrackFromFavorite.model_validate(data)
772
+ assert result.remove_track_from_favorite.track.id == "100000001"
773
+ assert result.remove_track_from_favorite.track.title == "Test Track"
774
+
775
+
776
+ def test_smoke_add_playlist_to_favorite() -> None:
777
+ """Verify AddPlaylistToFavorite fixture parses with returned playlist."""
778
+ data = _load_fixture("add_playlist_to_favorite.json")
779
+ result = AddPlaylistToFavorite.model_validate(data)
780
+ assert result.add_playlist_to_favorite.playlist.id == "1000000001"
781
+ assert result.add_playlist_to_favorite.playlist.title == "Test Playlist"
782
+
783
+
784
+ def test_smoke_remove_playlist_from_favorite() -> None:
785
+ """Verify RemovePlaylistFromFavorite fixture parses with returned playlist."""
786
+ data = _load_fixture("remove_playlist_from_favorite.json")
787
+ result = RemovePlaylistFromFavorite.model_validate(data)
788
+ assert result.remove_playlist_from_favorite.playlist.id == "1000000001"
789
+ assert result.remove_playlist_from_favorite.playlist.title == "Test Playlist"
790
+
791
+
792
+ # ---------------------------------------------------------------------------
793
+ # 8. Playlist mutation smoke tests
794
+ # ---------------------------------------------------------------------------
795
+
796
+
797
+ def test_smoke_create_playlist() -> None:
798
+ """Verify CreatePlaylist fixture parses with returned playlist."""
799
+ data = _load_fixture("create_playlist.json")
800
+ result = CreatePlaylist.model_validate(data)
801
+ playlist = result.create_playlist.playlist
802
+ assert playlist is not None
803
+ assert playlist.id == "1000000001"
804
+ assert playlist.title == "New Playlist"
805
+
806
+
807
+ def test_smoke_update_playlist() -> None:
808
+ """Verify UpdatePlaylist fixture parses with returned playlist."""
809
+ data = _load_fixture("update_playlist.json")
810
+ result = UpdatePlaylist.model_validate(data)
811
+ playlist = result.update_playlist.playlist
812
+ assert playlist is not None
813
+ assert playlist.id == "1000000001"
814
+ assert playlist.title == "Updated Playlist"
815
+
816
+
817
+ def test_smoke_delete_playlist() -> None:
818
+ """Verify DeletePlaylist fixture parses with delete status."""
819
+ data = _load_fixture("delete_playlist.json")
820
+ result = DeletePlaylist.model_validate(data)
821
+ assert result.delete_playlist.delete_status is True
822
+
823
+
824
+ def test_smoke_add_tracks_to_playlist() -> None:
825
+ """Verify AddTracksToPlaylist fixture parses the union success variant."""
826
+ data = _load_fixture("add_tracks_to_playlist.json")
827
+ result = AddTracksToPlaylist.model_validate(data)
828
+ output = result.add_tracks_to_playlist
829
+ assert output.typename__ == "PlaylistAddTracksOutput"
830
+ assert output.added_track_ids == ["100000001", "100000002"]
831
+
832
+
833
+ def test_smoke_remove_tracks_from_playlist() -> None:
834
+ """Verify RemoveTracksFromPlaylist fixture parses with removed track IDs."""
835
+ data = _load_fixture("remove_tracks_from_playlist.json")
836
+ result = RemoveTracksFromPlaylist.model_validate(data)
837
+ assert result.remove_tracks_from_playlist.removed_track_ids == ["100000001", "100000002"]