TLSharp/TLSharp.Tests/TLSharpTests.cs

381 lines
14 KiB
C#
Raw Normal View History

2016-10-23 11:00:52 +02:00

using System;
2016-09-24 15:38:26 +02:00
using System.Configuration;
using System.Diagnostics;
2016-10-23 13:10:54 +02:00
using System.IO;
2016-09-24 15:38:26 +02:00
using System.Linq;
2016-10-11 15:32:38 +02:00
using System.Threading;
2016-09-24 15:38:26 +02:00
using System.Threading.Tasks;
2016-10-23 11:00:52 +02:00
2016-10-11 15:32:38 +02:00
using TeleSharp.TL;
2016-10-23 13:10:54 +02:00
using TeleSharp.TL.Messages;
2016-09-24 15:38:26 +02:00
using TLSharp.Core;
Tests: include testcase for "couldn't read packet length" bug It seems that after triggering a FloodException, and waiting the required time to be able to use Telegram again, TLSharp throws an exception. I include the way to reproduce this bug as an [Ignore]d test with the hope that someone may help me fix the problem soon. For reference, the whole stacktrace of the exception was: Test Name: FloodExceptionShouldNotCauseCannotReadPackageLengthError Test FullName: TLSharp.Tests.TLSharpTestsVS.FloodExceptionShouldNotCauseCannotReadPackageLengthError Test Source: D:\Projects\GitHub\TLSharp\TLSharp.Tests.VS\TLSharpTestsVs.cs : line 72 Test Outcome: Failed Test Duration: 0:04:30.7467012 Result StackTrace: at TLSharp.Core.Network.TcpTransport.<Receieve>d__4.MoveNext() in D:\Projects\GitHub\TLSharp\TLSharp.Core\Network\TcpTransport.cs:line 39 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at TLSharp.Core.Network.MtProtoSender.<Receive>d__9.MoveNext() in D:\Projects\GitHub\TLSharp\TLSharp.Core\Network\MtProtoSender.cs:line 139 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at TLSharp.Core.TelegramClient.<ConnectAsync>d__8.MoveNext() in D:\Projects\GitHub\TLSharp\TLSharp.Core\TelegramClient.cs:line 76 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at TLSharp.Tests.TLSharpTests.<CheckPhones>d__54.MoveNext() in D:\Projects\GitHub\TLSharp\TLSharp.Tests\TLSharpTests.cs:line 329 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at TLSharp.Tests.TLSharpTestsVS.<CheckPhones>d__9.MoveNext() in D:\Projects\GitHub\TLSharp\TLSharp.Tests.VS\TLSharpTestsVs.cs:line 68 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at TLSharp.Tests.TLSharpTests.<FloodExceptionShouldNotCauseCannotReadPackageLengthError>d__55.MoveNext() in D:\Projects\GitHub\TLSharp\TLSharp.Tests\TLSharpTests.cs:line 340 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at TLSharp.Tests.TLSharpTestsVS.<FloodExceptionShouldNotCauseCannotReadPackageLengthError>d__10.MoveNext() in D:\Projects\GitHub\TLSharp\TLSharp.Tests.VS\TLSharpTestsVs.cs:line 73 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() Result Message: Test method TLSharp.Tests.TLSharpTestsVS.FloodExceptionShouldNotCauseCannotReadPackageLengthError threw exception: System.InvalidOperationException: Couldn't read the packet length
2016-11-29 18:28:22 +01:00
using TLSharp.Core.Network;
using TLSharp.Core.Requests;
2016-10-23 13:12:34 +02:00
using TLSharp.Core.Utils;
2016-09-24 15:38:26 +02:00
namespace TLSharp.Tests
{
public class TLSharpTests
{
private string NumberToSendMessage { get; set; }
private string NumberToAuthenticate { get; set; }
private string CodeToAuthenticate { get; set; }
2016-11-16 14:31:00 +01:00
private string PasswordToAuthenticate { get; set; }
2016-09-24 15:38:26 +02:00
private string NotRegisteredNumberToSignUp { get; set; }
private string UserNameToSendMessage { get; set; }
private string NumberToGetUserFull { get; set; }
private string NumberToAddToChat { get; set; }
private string ApiHash { get; set; }
2016-09-24 15:38:26 +02:00
private int ApiId { get; set; }
2016-09-24 15:38:26 +02:00
class Assert
{
static internal void IsNotNull(object obj)
{
IsNotNullHanlder(obj);
}
static internal void IsTrue(bool cond)
{
IsTrueHandler(cond);
}
}
internal static Action<object> IsNotNullHanlder;
internal static Action<bool> IsTrueHandler;
protected void Init(Action<object> notNullHandler, Action<bool> trueHandler)
2016-09-24 15:38:26 +02:00
{
IsNotNullHanlder = notNullHandler;
IsTrueHandler = trueHandler;
// Setup your API settings and phone numbers in app.config
GatherTestConfiguration();
}
private TelegramClient NewClient()
{
try
{
return new TelegramClient(ApiId, ApiHash);
}
catch (MissingApiConfigurationException ex)
{
throw new Exception($"Please add your API settings to the `app.config` file. (More info: {MissingApiConfigurationException.InfoUrl})",
ex);
}
}
private void GatherTestConfiguration()
{
string appConfigMsgWarning = "{0} not configured in app.config! Some tests may fail.";
ApiHash = ConfigurationManager.AppSettings[nameof(ApiHash)];
if (string.IsNullOrEmpty(ApiHash))
Debug.WriteLine(appConfigMsgWarning, nameof(ApiHash));
var apiId = ConfigurationManager.AppSettings[nameof(ApiId)];
if (string.IsNullOrEmpty(apiId))
Debug.WriteLine(appConfigMsgWarning, nameof(ApiId));
else
ApiId = int.Parse(apiId);
2016-09-24 15:38:26 +02:00
NumberToAuthenticate = ConfigurationManager.AppSettings[nameof(NumberToAuthenticate)];
if (string.IsNullOrEmpty(NumberToAuthenticate))
Debug.WriteLine(appConfigMsgWarning, nameof(NumberToAuthenticate));
2016-09-24 15:38:26 +02:00
CodeToAuthenticate = ConfigurationManager.AppSettings[nameof(CodeToAuthenticate)];
if (string.IsNullOrEmpty(CodeToAuthenticate))
Debug.WriteLine(appConfigMsgWarning, nameof(CodeToAuthenticate));
2016-11-16 14:31:00 +01:00
PasswordToAuthenticate = ConfigurationManager.AppSettings[nameof(PasswordToAuthenticate)];
if (string.IsNullOrEmpty(PasswordToAuthenticate))
Debug.WriteLine(appConfigMsgWarning, nameof(PasswordToAuthenticate));
2016-09-24 15:38:26 +02:00
NotRegisteredNumberToSignUp = ConfigurationManager.AppSettings[nameof(NotRegisteredNumberToSignUp)];
if (string.IsNullOrEmpty(NotRegisteredNumberToSignUp))
Debug.WriteLine(appConfigMsgWarning, nameof(NotRegisteredNumberToSignUp));
2016-09-24 15:38:26 +02:00
UserNameToSendMessage = ConfigurationManager.AppSettings[nameof(UserNameToSendMessage)];
if (string.IsNullOrEmpty(UserNameToSendMessage))
Debug.WriteLine(appConfigMsgWarning, nameof(UserNameToSendMessage));
2016-09-24 15:38:26 +02:00
NumberToGetUserFull = ConfigurationManager.AppSettings[nameof(NumberToGetUserFull)];
if (string.IsNullOrEmpty(NumberToGetUserFull))
Debug.WriteLine(appConfigMsgWarning, nameof(NumberToGetUserFull));
2016-09-24 15:38:26 +02:00
NumberToAddToChat = ConfigurationManager.AppSettings[nameof(NumberToAddToChat)];
if (string.IsNullOrEmpty(NumberToAddToChat))
Debug.WriteLine(appConfigMsgWarning, nameof(NumberToAddToChat));
2016-09-24 15:38:26 +02:00
}
public virtual async Task AuthUser()
2016-09-24 15:38:26 +02:00
{
var client = NewClient();
2016-09-24 15:38:26 +02:00
2016-10-11 15:32:38 +02:00
await client.ConnectAsync();
2016-09-24 15:38:26 +02:00
2016-10-11 15:32:38 +02:00
var hash = await client.SendCodeRequestAsync(NumberToAuthenticate);
var code = CodeToAuthenticate; // you can change code in debugger too
if (String.IsNullOrWhiteSpace(code))
{
throw new Exception("CodeToAuthenticate is empty in the app.config file, fill it with the code you just got now by SMS/Telegram");
}
2016-09-24 15:38:26 +02:00
TLUser user = null;
try
{
user = await client.MakeAuthAsync(NumberToAuthenticate, hash, code);
}
2016-11-16 14:31:00 +01:00
catch (CloudPasswordNeededException ex)
{
var password = await client.GetPasswordSetting();
var password_str = PasswordToAuthenticate;
user = await client.MakeAuthWithPasswordAsync(password,password_str);
}
catch (InvalidPhoneCodeException ex)
{
throw new Exception("CodeToAuthenticate is wrong in the app.config file, fill it with the code you just got now by SMS/Telegram",
ex);
}
2016-09-24 15:38:26 +02:00
Assert.IsNotNull(user);
Assert.IsTrue(client.IsUserAuthorized());
}
public virtual async Task SendMessageTest()
2016-10-23 12:29:18 +02:00
{
NumberToSendMessage = ConfigurationManager.AppSettings[nameof(NumberToSendMessage)];
if (string.IsNullOrWhiteSpace(NumberToSendMessage))
throw new Exception($"Please fill the '{nameof(NumberToSendMessage)}' setting in app.config file first");
// this is because the contacts in the address come without the "+" prefix
var normalizedNumber = NumberToSendMessage.StartsWith("+") ?
NumberToSendMessage.Substring(1, NumberToSendMessage.Length - 1) :
NumberToSendMessage;
var client = NewClient();
2016-10-11 15:32:38 +02:00
2016-10-23 12:29:18 +02:00
await client.ConnectAsync();
2016-10-11 15:32:38 +02:00
2016-10-23 12:29:18 +02:00
var result = await client.GetContactsAsync();
2016-10-11 15:32:38 +02:00
2016-10-23 12:29:18 +02:00
var user = result.users.lists
.OfType<TLUser>()
.FirstOrDefault(x => x.phone == normalizedNumber);
if (user == null)
{
throw new System.Exception("Number was not found in Contacts List of user: " + NumberToSendMessage);
}
2016-10-23 12:29:18 +02:00
await client.SendTypingAsync(new TLInputPeerUser() { user_id = user.id });
Thread.Sleep(3000);
await client.SendMessageAsync(new TLInputPeerUser() { user_id = user.id }, "TEST");
}
2016-10-11 15:32:38 +02:00
public virtual async Task SendMessageToChannelTest()
2016-10-23 12:29:18 +02:00
{
var client = NewClient();
2016-10-11 15:32:38 +02:00
2016-10-23 12:29:18 +02:00
await client.ConnectAsync();
2016-10-11 15:32:38 +02:00
2016-10-26 18:45:33 +02:00
var dialogs = (TLDialogs) await client.GetUserDialogsAsync();
2016-10-23 12:29:18 +02:00
var chat = dialogs.chats.lists
.OfType<TLChannel>()
2016-10-23 12:29:18 +02:00
.FirstOrDefault(c => c.title == "TestGroup");
2016-10-11 15:32:38 +02:00
2016-10-23 12:29:18 +02:00
await client.SendMessageAsync(new TLInputPeerChannel() { channel_id = chat.id, access_hash = chat.access_hash.Value }, "TEST MSG");
}
2016-10-11 15:32:38 +02:00
public virtual async Task SendPhotoToContactTest()
{
var client = NewClient();
await client.ConnectAsync();
var result = await client.GetContactsAsync();
var user = result.users.lists
.OfType<TLUser>()
.FirstOrDefault(x => x.phone == NumberToSendMessage);
var fileResult = (TLInputFile)await client.UploadFile("cat.jpg", new StreamReader("data/cat.jpg"));
2016-10-23 12:29:18 +02:00
await client.SendUploadedPhoto(new TLInputPeerUser() { user_id = user.id }, fileResult, "kitty");
}
public virtual async Task SendBigFileToContactTest()
{
var client = NewClient();
await client.ConnectAsync();
var result = await client.GetContactsAsync();
var user = result.users.lists
.OfType<TLUser>()
.FirstOrDefault(x => x.phone == NumberToSendMessage);
2016-10-23 12:29:18 +02:00
var fileResult = (TLInputFileBig)await client.UploadFile("some.zip", new StreamReader("<some big file path>"));
await client.SendUploadedDocument(
2016-10-23 12:29:18 +02:00
new TLInputPeerUser() { user_id = user.id },
fileResult,
"some zips",
"application/zip",
2016-10-23 12:29:18 +02:00
new TLVector<TLAbsDocumentAttribute>());
}
public virtual async Task DownloadFileFromContactTest()
2016-10-23 12:29:18 +02:00
{
var client = NewClient();
2016-10-23 12:29:18 +02:00
await client.ConnectAsync();
var result = await client.GetContactsAsync();
var user = result.users.lists
.OfType<TLUser>()
2016-10-23 12:29:18 +02:00
.FirstOrDefault(x => x.phone == NumberToSendMessage);
var inputPeer = new TLInputPeerUser() { user_id = user.id };
var res = await client.SendRequestAsync<TLMessagesSlice>(new TLRequestGetHistory() { peer = inputPeer });
var document = res.messages.lists
.OfType<TLMessage>()
.Where(m => m.media != null)
2016-10-23 12:29:18 +02:00
.Select(m => m.media)
.OfType<TLMessageMediaDocument>()
2016-10-23 12:29:18 +02:00
.Select(md => md.document)
.OfType<TLDocument>()
2016-10-23 12:29:18 +02:00
.First();
var resFile = await client.GetFile(
new TLInputDocumentFileLocation()
{
access_hash = document.access_hash,
id = document.id,
version = document.version
},
document.size);
Assert.IsTrue(resFile.bytes.Length > 0);
}
public virtual async Task DownloadFileFromWrongLocationTest()
2016-10-29 10:47:18 +02:00
{
var client = NewClient();
await client.ConnectAsync();
var result = await client.GetContactsAsync();
var user = result.users.lists
.OfType<TLUser>()
2016-10-29 10:47:18 +02:00
.FirstOrDefault(x => x.id == 5880094);
var photo = ((TLUserProfilePhoto)user.photo);
var photoLocation = (TLFileLocation) photo.photo_big;
var resFile = await client.GetFile(new TLInputFileLocation()
{
local_id = photoLocation.local_id,
secret = photoLocation.secret,
volume_id = photoLocation.volume_id
}, 1024);
var res = await client.GetUserDialogsAsync();
Assert.IsTrue(resFile.bytes.Length > 0);
}
public virtual async Task SignUpNewUser()
2016-09-24 15:38:26 +02:00
{
var client = NewClient();
2016-10-11 15:32:38 +02:00
await client.ConnectAsync();
2016-09-24 15:38:26 +02:00
2016-10-11 15:32:38 +02:00
var hash = await client.SendCodeRequestAsync(NotRegisteredNumberToSignUp);
2016-09-24 15:38:26 +02:00
var code = "";
2016-10-11 15:32:38 +02:00
var registeredUser = await client.SignUpAsync(NotRegisteredNumberToSignUp, hash, code, "TLSharp", "User");
2016-09-24 15:38:26 +02:00
Assert.IsNotNull(registeredUser);
Assert.IsTrue(client.IsUserAuthorized());
2016-10-11 15:32:38 +02:00
var loggedInUser = await client.MakeAuthAsync(NotRegisteredNumberToSignUp, hash, code);
2016-09-24 15:38:26 +02:00
Assert.IsNotNull(loggedInUser);
}
public virtual async Task CheckPhones()
2016-09-24 15:38:26 +02:00
{
var client = NewClient();
2016-10-11 15:32:38 +02:00
await client.ConnectAsync();
2016-09-24 15:38:26 +02:00
2016-10-11 15:32:38 +02:00
var result = await client.IsPhoneRegisteredAsync(NumberToAuthenticate);
2016-09-24 15:38:26 +02:00
Assert.IsTrue(result);
}
Tests: include testcase for "couldn't read packet length" bug It seems that after triggering a FloodException, and waiting the required time to be able to use Telegram again, TLSharp throws an exception. I include the way to reproduce this bug as an [Ignore]d test with the hope that someone may help me fix the problem soon. For reference, the whole stacktrace of the exception was: Test Name: FloodExceptionShouldNotCauseCannotReadPackageLengthError Test FullName: TLSharp.Tests.TLSharpTestsVS.FloodExceptionShouldNotCauseCannotReadPackageLengthError Test Source: D:\Projects\GitHub\TLSharp\TLSharp.Tests.VS\TLSharpTestsVs.cs : line 72 Test Outcome: Failed Test Duration: 0:04:30.7467012 Result StackTrace: at TLSharp.Core.Network.TcpTransport.<Receieve>d__4.MoveNext() in D:\Projects\GitHub\TLSharp\TLSharp.Core\Network\TcpTransport.cs:line 39 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at TLSharp.Core.Network.MtProtoSender.<Receive>d__9.MoveNext() in D:\Projects\GitHub\TLSharp\TLSharp.Core\Network\MtProtoSender.cs:line 139 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at TLSharp.Core.TelegramClient.<ConnectAsync>d__8.MoveNext() in D:\Projects\GitHub\TLSharp\TLSharp.Core\TelegramClient.cs:line 76 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at TLSharp.Tests.TLSharpTests.<CheckPhones>d__54.MoveNext() in D:\Projects\GitHub\TLSharp\TLSharp.Tests\TLSharpTests.cs:line 329 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at TLSharp.Tests.TLSharpTestsVS.<CheckPhones>d__9.MoveNext() in D:\Projects\GitHub\TLSharp\TLSharp.Tests.VS\TLSharpTestsVs.cs:line 68 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at TLSharp.Tests.TLSharpTests.<FloodExceptionShouldNotCauseCannotReadPackageLengthError>d__55.MoveNext() in D:\Projects\GitHub\TLSharp\TLSharp.Tests\TLSharpTests.cs:line 340 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at TLSharp.Tests.TLSharpTestsVS.<FloodExceptionShouldNotCauseCannotReadPackageLengthError>d__10.MoveNext() in D:\Projects\GitHub\TLSharp\TLSharp.Tests.VS\TLSharpTestsVs.cs:line 73 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() Result Message: Test method TLSharp.Tests.TLSharpTestsVS.FloodExceptionShouldNotCauseCannotReadPackageLengthError threw exception: System.InvalidOperationException: Couldn't read the packet length
2016-11-29 18:28:22 +01:00
public virtual async Task FloodExceptionShouldNotCauseCannotReadPackageLengthError()
{
for (int i = 0; i < 50; i++)
{
try
{
await CheckPhones();
}
catch (FloodException floodException)
{
Console.WriteLine($"FLOODEXCEPTION: {floodException}");
Thread.Sleep(floodException.TimeToWait);
}
}
}
public virtual async Task SendMessageByUserNameTest()
{
UserNameToSendMessage = ConfigurationManager.AppSettings[nameof(UserNameToSendMessage)];
if (string.IsNullOrWhiteSpace(UserNameToSendMessage))
throw new Exception($"Please fill the '{nameof(UserNameToSendMessage)}' setting in app.config file first");
var client = NewClient();
await client.ConnectAsync();
var result = await client.SearchUserAsync(UserNameToSendMessage);
var user = result.users.lists
.Where(x => x.GetType() == typeof(TLUser))
.OfType<TLUser>()
.FirstOrDefault(x => x.username == UserNameToSendMessage.TrimStart('@'));
if (user == null)
{
var contacts = await client.GetContactsAsync();
user = contacts.users.lists
.Where(x => x.GetType() == typeof(TLUser))
.OfType<TLUser>()
.FirstOrDefault(x => x.username == UserNameToSendMessage.TrimStart('@'));
}
if (user == null)
{
throw new System.Exception("Username was not found: " + UserNameToSendMessage);
}
await client.SendTypingAsync(new TLInputPeerUser() { user_id = user.id });
Thread.Sleep(3000);
await client.SendMessageAsync(new TLInputPeerUser() { user_id = user.id }, "TEST");
}
2016-09-24 15:38:26 +02:00
}
}