|
18 | 18 | using System.Net; |
19 | 19 | using System.Net.Http; |
20 | 20 | using System.Net.Http.Headers; |
| 21 | +using System.Text; |
21 | 22 | using System.Threading.Tasks; |
| 23 | +using FirebaseAdmin.Auth.Hash; |
22 | 24 | using FirebaseAdmin.Tests; |
23 | 25 | using FirebaseAdmin.Util; |
24 | 26 | using Google.Apis.Auth.OAuth2; |
@@ -1871,6 +1873,183 @@ public async Task CreateSessionCookie() |
1871 | 1873 | this.AssertClientVersion(handler.LastRequestHeaders); |
1872 | 1874 | } |
1873 | 1875 |
|
| 1876 | + [Fact] |
| 1877 | + public async Task ImportUsers() |
| 1878 | + { |
| 1879 | + var handler = new MockMessageHandler() |
| 1880 | + { |
| 1881 | + Response = "{}", |
| 1882 | + }; |
| 1883 | + var auth = this.CreateFirebaseAuth(handler); |
| 1884 | + var users = new List<ImportUserRecordArgs>() |
| 1885 | + { |
| 1886 | + new ImportUserRecordArgs() { Uid = "user1" }, |
| 1887 | + new ImportUserRecordArgs() { Uid = "user2" }, |
| 1888 | + }; |
| 1889 | + |
| 1890 | + var result = await auth.ImportUsersAsync(users); |
| 1891 | + |
| 1892 | + Assert.Equal(2, result.SuccessCount); |
| 1893 | + Assert.Equal(0, result.FailureCount); |
| 1894 | + Assert.Empty(result.Errors); |
| 1895 | + |
| 1896 | + Assert.Equal(1, handler.Requests.Count); |
| 1897 | + var expected = new JObject() |
| 1898 | + { |
| 1899 | + { |
| 1900 | + "users", new JArray() |
| 1901 | + { |
| 1902 | + new JObject() { { "localId", "user1" } }, |
| 1903 | + new JObject() { { "localId", "user2" } }, |
| 1904 | + } |
| 1905 | + }, |
| 1906 | + }; |
| 1907 | + var request = NewtonsoftJsonSerializer.Instance.Deserialize<JObject>( |
| 1908 | + handler.LastRequestBody); |
| 1909 | + Assert.True(JToken.DeepEquals(expected, request)); |
| 1910 | + this.AssertClientVersion(handler.LastRequestHeaders); |
| 1911 | + } |
| 1912 | + |
| 1913 | + [Fact] |
| 1914 | + public async Task ImportUsersError() |
| 1915 | + { |
| 1916 | + var handler = new MockMessageHandler() |
| 1917 | + { |
| 1918 | + Response = @"{ |
| 1919 | + ""error"": [ |
| 1920 | + {""index"": 1, ""message"": ""test error""} |
| 1921 | + ] |
| 1922 | + }", |
| 1923 | + }; |
| 1924 | + var auth = this.CreateFirebaseAuth(handler); |
| 1925 | + var usersList = new List<ImportUserRecordArgs>() |
| 1926 | + { |
| 1927 | + new ImportUserRecordArgs() { Uid = "user1" }, |
| 1928 | + new ImportUserRecordArgs() { Uid = "user2" }, |
| 1929 | + }; |
| 1930 | + |
| 1931 | + var result = await auth.ImportUsersAsync(usersList); |
| 1932 | + |
| 1933 | + Assert.Equal(1, result.SuccessCount); |
| 1934 | + Assert.Equal(1, result.FailureCount); |
| 1935 | + var error = Assert.Single(result.Errors); |
| 1936 | + Assert.Equal(1, error.Index); |
| 1937 | + Assert.Equal("test error", error.Reason); |
| 1938 | + |
| 1939 | + Assert.Equal(1, handler.Requests.Count); |
| 1940 | + this.AssertClientVersion(handler.LastRequestHeaders); |
| 1941 | + } |
| 1942 | + |
| 1943 | + [Fact] |
| 1944 | + public async Task ImportUsersWithPassword() |
| 1945 | + { |
| 1946 | + var handler = new MockMessageHandler() |
| 1947 | + { |
| 1948 | + Response = "{}", |
| 1949 | + }; |
| 1950 | + var auth = this.CreateFirebaseAuth(handler); |
| 1951 | + var password = Encoding.UTF8.GetBytes("password"); |
| 1952 | + var usersList = new List<ImportUserRecordArgs>() |
| 1953 | + { |
| 1954 | + new ImportUserRecordArgs() { Uid = "user1" }, |
| 1955 | + new ImportUserRecordArgs() |
| 1956 | + { |
| 1957 | + Uid = "user2", |
| 1958 | + PasswordHash = password, |
| 1959 | + }, |
| 1960 | + }; |
| 1961 | + |
| 1962 | + var result = await auth.ImportUsersAsync(usersList, new UserImportOptions() |
| 1963 | + { |
| 1964 | + Hash = new Bcrypt(), |
| 1965 | + }); |
| 1966 | + |
| 1967 | + Assert.Equal(2, result.SuccessCount); |
| 1968 | + Assert.Equal(0, result.FailureCount); |
| 1969 | + Assert.Empty(result.Errors); |
| 1970 | + |
| 1971 | + Assert.Equal(1, handler.Requests.Count); |
| 1972 | + var expected = new JObject() |
| 1973 | + { |
| 1974 | + { |
| 1975 | + "users", new JArray() |
| 1976 | + { |
| 1977 | + new JObject() { { "localId", "user1" } }, |
| 1978 | + new JObject() |
| 1979 | + { |
| 1980 | + { "localId", "user2" }, |
| 1981 | + { "passwordHash", JwtUtils.UrlSafeBase64Encode(password) }, |
| 1982 | + }, |
| 1983 | + } |
| 1984 | + }, |
| 1985 | + { "hashAlgorithm", "BCRYPT" }, |
| 1986 | + }; |
| 1987 | + var request = NewtonsoftJsonSerializer.Instance.Deserialize<JObject>( |
| 1988 | + handler.LastRequestBody); |
| 1989 | + Assert.True(JToken.DeepEquals(expected, request)); |
| 1990 | + this.AssertClientVersion(handler.LastRequestHeaders); |
| 1991 | + } |
| 1992 | + |
| 1993 | + [Fact] |
| 1994 | + public async Task ImportUsersMissingHash() |
| 1995 | + { |
| 1996 | + var auth = this.CreateFirebaseAuth(new MockMessageHandler()); |
| 1997 | + var usersList = new List<ImportUserRecordArgs>() |
| 1998 | + { |
| 1999 | + new ImportUserRecordArgs() { Uid = "user1" }, |
| 2000 | + new ImportUserRecordArgs() |
| 2001 | + { |
| 2002 | + Uid = "user2", |
| 2003 | + PasswordHash = Encoding.UTF8.GetBytes("password"), |
| 2004 | + }, |
| 2005 | + }; |
| 2006 | + |
| 2007 | + var exception = await Assert.ThrowsAsync<ArgumentException>( |
| 2008 | + () => auth.ImportUsersAsync(usersList)); |
| 2009 | + |
| 2010 | + Assert.Equal( |
| 2011 | + "UserImportHash option is required when at least one user has a password.", |
| 2012 | + exception.Message); |
| 2013 | + } |
| 2014 | + |
| 2015 | + [Fact] |
| 2016 | + public async Task ImportUsersEmpty() |
| 2017 | + { |
| 2018 | + var auth = this.CreateFirebaseAuth(new MockMessageHandler()); |
| 2019 | + |
| 2020 | + var exception = await Assert.ThrowsAsync<ArgumentException>( |
| 2021 | + () => auth.ImportUsersAsync(new List<ImportUserRecordArgs>())); |
| 2022 | + |
| 2023 | + Assert.Equal("Users must not be null or empty.", exception.Message); |
| 2024 | + } |
| 2025 | + |
| 2026 | + [Fact] |
| 2027 | + public async Task ImportUsersNull() |
| 2028 | + { |
| 2029 | + var auth = this.CreateFirebaseAuth(new MockMessageHandler()); |
| 2030 | + |
| 2031 | + var exception = await Assert.ThrowsAsync<ArgumentException>( |
| 2032 | + () => auth.ImportUsersAsync(null)); |
| 2033 | + |
| 2034 | + Assert.Equal("Users must not be null or empty.", exception.Message); |
| 2035 | + } |
| 2036 | + |
| 2037 | + [Fact] |
| 2038 | + public async Task ImportUsersExceedLimit() |
| 2039 | + { |
| 2040 | + var auth = this.CreateFirebaseAuth(new MockMessageHandler()); |
| 2041 | + var users = new List<ImportUserRecordArgs>(); |
| 2042 | + for (int i = 0; i < 1001; i++) |
| 2043 | + { |
| 2044 | + users.Add(new ImportUserRecordArgs() { Uid = $"user{i}" }); |
| 2045 | + } |
| 2046 | + |
| 2047 | + var exception = await Assert.ThrowsAsync<ArgumentException>( |
| 2048 | + () => auth.ImportUsersAsync(users)); |
| 2049 | + |
| 2050 | + Assert.Equal("Users list must not contain more than 1000 items.", exception.Message); |
| 2051 | + } |
| 2052 | + |
1874 | 2053 | [Fact] |
1875 | 2054 | public async Task ServiceUnvailable() |
1876 | 2055 | { |
|
0 commit comments