Skip to content
代码片段 群组 项目
提交 ef8afd35 编辑于 作者: Raymond Liao's avatar Raymond Liao :nerd: 提交者: Neil Wang
浏览文件

feat: #331 用户未登录时查看我的页面

上级 864cfda2
No related branches found
No related tags found
无相关合并请求
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18" class="design-iconfont">
<path
d="M12.75,0 C14.2687831,0 15.5,1.23121694 15.5,2.75 L15.5,2.75 L15.5,10.5961538 C15.5,12.1149369 14.2687831,13.3461538 12.75,13.3461538 L12.75,13.3461538 L10.7327498,13.3461538 C10.6749195,13.3461538 10.6188777,13.3662028 10.5741706,13.4028855 L10.5741706,13.4028855 L8.86005407,14.8093401 C8.21473147,15.3388356 7.28526853,15.3388356 6.63994593,14.8093401 L6.63994593,14.8093401 L4.92582937,13.4028855 C4.8811223,13.3662028 4.82508052,13.3461538 4.76725022,13.3461538 L4.76725022,13.3461538 L2.75,13.3461538 C1.23121694,13.3461538 0,12.1149369 0,10.5961538 L0,10.5961538 L0,2.75 C0,1.23121694 1.23121694,0 2.75,0 L2.75,0 Z M12.75,1.5 L2.75,1.5 C2.05964406,1.5 1.5,2.05964406 1.5,2.75 L1.5,2.75 L1.5,10.5961538 C1.5,11.2865098 2.05964406,11.8461538 2.75,11.8461538 L2.75,11.8461538 L4.76725022,11.8461538 C5.17206236,11.8461538 5.5643548,11.9864964 5.87730429,12.2432754 L5.87730429,12.2432754 L7.59142085,13.6497301 C7.68360979,13.7253723 7.81639021,13.7253723 7.90857915,13.6497301 L7.90857915,13.6497301 L9.62269571,12.2432754 C9.9356452,11.9864964 10.3279376,11.8461538 10.7327498,11.8461538 L10.7327498,11.8461538 L12.75,11.8461538 C13.4403559,11.8461538 14,11.2865098 14,10.5961538 L14,10.5961538 L14,2.75 C14,2.05964406 13.4403559,1.5 12.75,1.5 L12.75,1.5 Z M9.50516993,7.43035545 C9.68180314,7.05569082 10.1287183,6.89515463 10.503383,7.07178784 C10.8780476,7.24842104 11.0385838,7.69533624 10.8619506,8.07000087 C10.2456716,9.37721793 8.93788701,10.2266214 7.47509173,10.2266214 C6.00227259,10.2266214 4.68114752,9.37151695 4.07079651,8.06827032 C3.89511906,7.69315659 4.05679411,7.24665212 4.43190784,7.07097467 C4.80702157,6.89529723 5.25352604,7.05697227 5.42920349,7.432086 C5.79466339,8.21243106 6.58908069,8.72662142 7.47509173,8.72662142 C8.35074671,8.72662142 9.1338374,8.21800557 9.50516993,7.43035545 Z"
transform="translate(1.25 1.25)" fill="#66696D" fill-rule="nonzero" />
</svg>
import 'package:flutter/material.dart';
import 'package:jihu_gitlab_app/core/user_provider.dart';
typedef WebViewCreatedCallback = void Function();
......@@ -13,7 +12,7 @@ class HomeAppBar extends AppBar {
if (canGoBack ?? false) {
leading = goBackLeading;
} else if (UserProvider.authorized) {
} else {
leading = orElseLeading;
}
......
import 'package:flutter/material.dart';
import 'package:jihu_gitlab_app/core/package_device_info.dart';
import 'package:jihu_gitlab_app/core/token_provider.dart';
import 'package:jihu_gitlab_app/core/user_provider.dart';
import 'package:jihu_gitlab_app/core/package_device_info.dart';
import 'package:jihu_gitlab_app/core/widgets/user/user_info_view.dart';
class HomeDrawer extends Drawer {
......@@ -18,16 +18,17 @@ class HomeDrawer extends Drawer {
const UserInfoView(),
Column(children: <Widget>[
const Divider(),
ListTile(
leading: const Icon(Icons.logout),
dense: true,
trailing: Text(
"Version ${PackageDeviceInfo.versionNumber}(${PackageDeviceInfo.buildNumber})",
style: textTheme.bodySmall,
),
onTap: () {
onLogoutTapped(context);
})
if (UserProvider.authorized)
ListTile(
leading: const Icon(Icons.logout),
dense: true,
trailing: Text(
"Version ${PackageDeviceInfo.versionNumber}(${PackageDeviceInfo.buildNumber})",
style: textTheme.bodySmall,
),
onTap: () {
onLogoutTapped(context);
})
]),
]),
),
......
......@@ -36,45 +36,46 @@ class _UserInfoViewState extends State<UserInfoView> {
final textTheme = Theme.of(context).textTheme;
return Flexible(
child: ListView(shrinkWrap: true, children: <Widget>[
SizedBox(
height: 100.0,
child: DrawerHeader(
margin: EdgeInsets.zero,
padding: const EdgeInsets.only(bottom: 12),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
const SizedBox(width: 16),
SizedBox(
height: 40,
child: Avatar(
avatarUrl: UserProvider.user?.avatarUrl ?? '',
size: 40,
if (UserProvider.authorized)
SizedBox(
height: 100.0,
child: DrawerHeader(
margin: EdgeInsets.zero,
padding: const EdgeInsets.only(bottom: 12),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
const SizedBox(width: 16),
SizedBox(
height: 40,
child: Avatar(
avatarUrl: UserProvider.user?.avatarUrl ?? '',
size: 40,
),
),
),
const SizedBox(width: 10),
Column(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(UserProvider.user?.name ?? 'Name', style: textTheme.titleLarge),
const SizedBox(height: 6),
Text("@${UserProvider.user?.username ?? 'username'}", style: textTheme.bodySmall)
],
)
],
),
)),
const SizedBox(width: 10),
Column(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(UserProvider.user?.name ?? 'Name', style: textTheme.titleLarge),
const SizedBox(height: 6),
Text("@${UserProvider.user?.username ?? 'username'}", style: textTheme.bodySmall)
],
)
],
),
)),
Column(
children: [
ListTile(
title: Text('Help', style: textTheme.titleLarge),
contentPadding: const EdgeInsets.only(left: 16, top: 16),
),
_buildListTile(context, () async => await _openEmail(), SvgPicture.asset("assets/images/feedback.svg", semanticsLabel: 'App feedback', width: 18, height: 18), "App feedback"),
_buildListTile(context, () async => await _openEmail(), SvgPicture.asset("assets/images/feedback.svg", semanticsLabel: 'Feedback via email', width: 18, height: 18), "Feedback via email"),
const Divider(thickness: 1, indent: 16, endIndent: 16, color: Color(0xFFEAEAEA)),
_buildListTile(
context, () => Navigator.of(context).pushNamed(PostSalesServicePage.routeName), Image.asset("assets/images/post_sales_service_icon.png", height: 18, width: 18), "Post-Sales service"),
_buildListTile(context, () => Navigator.of(context).pushNamed(PostSalesServicePage.routeName),
SvgPicture.asset("assets/images/support.svg", semanticsLabel: 'Support', width: 18, height: 18), "Support"),
],
)
]),
......@@ -118,7 +119,6 @@ class _UserInfoViewState extends State<UserInfoView> {
),
TextButton(
onPressed: () {
debugPrint('======> onPressed');
Clipboard.setData(const ClipboardData(text: feedbackEmail));
Navigator.pop(context);
},
......
......@@ -142,7 +142,7 @@ class _HomePageState extends State<HomePage> {
return Consumer<UserProvider>(builder: (context, _, child) {
return Scaffold(
key: GlobalKeys.rootScaffoldKey,
drawer: UserProvider.authorized ? const HomeDrawer() : null,
drawer: const HomeDrawer(),
body: IndexedStack(
index: _currentIndex,
children: _pages,
......
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jihu_gitlab_app/core/local_storage.dart';
import 'package:jihu_gitlab_app/core/net/http_client.dart';
import 'package:jihu_gitlab_app/core/net/response.dart';
import 'package:jihu_gitlab_app/core/token_provider.dart';
import 'package:jihu_gitlab_app/core/uri_launcher.dart';
import 'package:jihu_gitlab_app/core/user_provider.dart';
import 'package:jihu_gitlab_app/core/widgets/avatar/avatar.dart';
import 'package:jihu_gitlab_app/core/widgets/home/home_drawer.dart';
import 'package:jihu_gitlab_app/core/widgets/user/user_info_view.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../../mocker/tester.dart';
import '../../../test_data/user.dart';
import '../../net/http_request_test.mocks.dart';
import 'home_drawer_test.mocks.dart';
......@@ -18,7 +23,12 @@ import 'home_drawer_test.mocks.dart';
void main() {
final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized();
setUp(() {
setUp(() async {
SharedPreferences.setMockInitialValues(<String, Object>{});
await LocalStorage.init();
UserProvider().reset(Tester.user());
TokenProvider().reset(Tester.token());
final client = MockHttpClient();
when(client.get<Map<String, dynamic>>("/api/v4/user")).thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>(userInfo)));
HttpClient.setInstance(client);
......@@ -118,8 +128,8 @@ void main() {
await tester.tap(find.text(testButtonTitle), warnIfMissed: false);
await tester.pumpAndSettle();
expect(find.widgetWithText(ListTile, "App feedback"), findsOneWidget);
await tester.tap(find.widgetWithText(ListTile, "App feedback"));
expect(find.widgetWithText(ListTile, "Feedback via email"), findsOneWidget);
await tester.tap(find.widgetWithText(ListTile, "Feedback via email"));
await tester.pumpAndSettle();
expect(find.byType(CupertinoAlertDialog), findsOneWidget);
expect(find.widgetWithText(TextButton, "Copy Address"), findsOneWidget);
......
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_svg/svg.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jihu_gitlab_app/core/browser_launcher.dart';
import 'package:jihu_gitlab_app/core/global_keys.dart';
......@@ -60,10 +61,10 @@ void main() {
expect(find.byType(Drawer), findsOneWidget);
expect(find.text('Help'), findsOneWidget);
expect(find.image(const AssetImage("assets/images/post_sales_service_icon.png")), findsOneWidget);
expect(find.text('Post-Sales service'), findsOneWidget);
expect(find.byWidgetPredicate((widget) => widget is SvgPicture && widget.semanticsLabel == 'Support'), findsOneWidget);
expect(find.text('Support'), findsOneWidget);
await tester.tap(find.text('Post-Sales service'));
await tester.tap(find.text('Support'));
await tester.pumpAndSettle();
expect(find.byType(PostSalesServicePage), findsOneWidget);
......@@ -123,7 +124,7 @@ void main() {
await tester.tap(find.byIcon(Icons.density_medium));
await tester.pumpAndSettle();
await tester.tap(find.text('Post-Sales service'));
await tester.tap(find.text('Support'));
await tester.pumpAndSettle();
expect(find.byType(PostSalesServicePage), findsOneWidget);
......@@ -176,7 +177,7 @@ void main() {
await tester.tap(find.byIcon(Icons.density_medium));
await tester.pumpAndSettle();
await tester.tap(find.text('Post-Sales service'));
await tester.tap(find.text('Support'));
await tester.pumpAndSettle();
expect(find.byType(PostSalesServicePage), findsOneWidget);
......@@ -214,7 +215,7 @@ void main() {
await tester.tap(find.byIcon(Icons.density_medium));
await tester.pumpAndSettle();
await tester.tap(find.text('Post-Sales service'));
await tester.tap(find.text('Support'));
await tester.pumpAndSettle();
expect(find.byType(PostSalesServicePage), findsOneWidget);
......@@ -248,7 +249,7 @@ void main() {
await tester.tap(find.byIcon(Icons.density_medium));
await tester.pumpAndSettle();
await tester.tap(find.text('Post-Sales service'));
await tester.tap(find.text('Support'));
await tester.pumpAndSettle();
expect(find.byType(PostSalesServicePage), findsOneWidget);
......
......@@ -2,9 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jihu_gitlab_app/core/dependency_injector.dart';
import 'package:jihu_gitlab_app/core/local_storage.dart';
import 'package:jihu_gitlab_app/core/net/http_client.dart';
import 'package:jihu_gitlab_app/core/net/response.dart';
import 'package:jihu_gitlab_app/core/token_provider.dart';
import 'package:jihu_gitlab_app/core/user_provider.dart';
import 'package:jihu_gitlab_app/generated/current_locale.dart';
......@@ -15,11 +12,9 @@ import 'package:jihu_gitlab_app/modules/projects/projects_model.dart';
import 'package:jihu_gitlab_app/modules/projects/projects_page.dart';
import 'package:mockito/mockito.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../core/net/http_request_test.mocks.dart';
import '../../integration_tests/create_issue_in_sub_group_test.mocks.dart';
import '../../mocker/tester.dart';
final client = MockHttpClient();
......@@ -52,16 +47,7 @@ void main() {
TokenProvider().fullReset();
});
testWidgets('Should display menu button on the top left corner if user has logged in', (WidgetTester tester) async {
SharedPreferences.setMockInitialValues(<String, Object>{});
await LocalStorage.init();
TokenProvider().reset(Tester.token());
UserProvider().reset(Tester.user());
final client = MockHttpClient();
when(client.get("/api/v4/groups?top_level_only=true&page=1&per_page=50")).thenAnswer((_) => Future(() => Response.of([])));
HttpClient.setInstance(client);
testWidgets('Should display menu button on the top left corner', (WidgetTester tester) async {
await tester.pumpWidget(MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => TokenProvider()),
......@@ -79,24 +65,5 @@ void main() {
UserProvider().fullReset();
TokenProvider().fullReset();
});
testWidgets('Should not display menu button on the top left corner if user not login', (WidgetTester tester) async {
await tester.pumpWidget(MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => TokenProvider()),
ChangeNotifierProvider(create: (context) => UserProvider()),
ChangeNotifierProvider(create: (context) => CurrentLocale())
],
child: const MaterialApp(
home: Scaffold(body: Projects()),
localizationsDelegates: [GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, GlobalWidgetsLocalizations.delegate, S.delegate],
)));
await tester.pumpAndSettle();
expect(find.byIcon(Icons.density_medium), findsNothing);
UserProvider().fullReset();
TokenProvider().fullReset();
});
});
}
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jihu_gitlab_app/core/local_storage.dart';
import 'package:jihu_gitlab_app/core/token_provider.dart';
import 'package:jihu_gitlab_app/core/user_provider.dart';
import 'package:jihu_gitlab_app/generated/current_locale.dart';
import 'package:jihu_gitlab_app/generated/l10n.dart';
import 'package:jihu_gitlab_app/modules/resources/resources_page.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../mocker/tester.dart';
void main() {
group('Resources Page', () {
testWidgets('Should display menu button on the top left corner if user has logged in', (WidgetTester tester) async {
SharedPreferences.setMockInitialValues(<String, Object>{});
await LocalStorage.init();
TokenProvider().reset(Tester.token());
UserProvider().reset(Tester.user());
testWidgets('Should display menu button on the top left corner', (WidgetTester tester) async {
await tester.pumpWidget(MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => TokenProvider()),
......@@ -37,25 +28,5 @@ void main() {
UserProvider().fullReset();
TokenProvider().fullReset();
});
testWidgets('Should not display menu button on the top left corner if user did not login', (WidgetTester tester) async {
TokenProvider().clear();
await tester.pumpWidget(MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => TokenProvider()),
ChangeNotifierProvider(create: (context) => UserProvider()),
ChangeNotifierProvider(create: (context) => CurrentLocale())
],
child: const MaterialApp(
home: Scaffold(body: Resources()),
localizationsDelegates: [GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, GlobalWidgetsLocalizations.delegate, S.delegate],
)));
await tester.pumpAndSettle();
expect(find.byIcon(Icons.density_medium), findsNothing);
UserProvider().fullReset();
TokenProvider().fullReset();
});
});
}
......@@ -81,13 +81,7 @@ void main() {
TokenProvider().fullReset();
});
testWidgets('Should display menu button on the left top corner if user has logged in', (WidgetTester tester) async {
TokenProvider().reset(Tester.token());
UserProvider().reset(Tester.user());
when(client.get<List<dynamic>>("/api/v4/todos?page=1&per_page=20")).thenAnswer((_) => Future(() => Response.of<List<dynamic>>(data)));
HttpClient.setInstance(client);
testWidgets('Should display menu button on the left top corner', (WidgetTester tester) async {
await tester.pumpWidget(MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => TokenProvider()),
......@@ -106,25 +100,6 @@ void main() {
TokenProvider().fullReset();
});
testWidgets('Should not display menu button on the top left corner if user not login', (WidgetTester tester) async {
await tester.pumpWidget(MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => TokenProvider()),
ChangeNotifierProvider(create: (context) => UserProvider()),
ChangeNotifierProvider(create: (context) => CurrentLocale())
],
child: const MaterialApp(
home: Scaffold(body: TodoListPage()),
localizationsDelegates: [GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, GlobalWidgetsLocalizations.delegate, S.delegate],
)));
await tester.pumpAndSettle();
expect(find.byIcon(Icons.density_medium), findsNothing);
UserProvider().fullReset();
TokenProvider().fullReset();
});
testWidgets('Should display drawer view with logout button when user tapped the menu button on the left top corner after login', (WidgetTester tester) async {
TokenProvider().reset(Tester.token());
UserProvider().reset(Tester.user());
......
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册